スタックとblockについて
1222 ワード
一時変数はスタック内のオブジェクトはスタック内に存在します
blockについて
cとocの最大の違いは静的言語と動的言語である.
まずcの書き方を見てみましょう
c言語はblockとは言わず、関数ポインタと呼ばれ、その実現メカニズムは、関数エントリが固定されていることであり、私は関数エントリを知っていれば正しく関数を呼び出すことができるので、関数アドレスを関数ポインタに割り当て、呼び出すときに直接このポインタを使えばよい.
ocを見てみましょうまずcの書き方を採用して、関数のポインタを使って関数を呼び出します
実験結果:構文エラーコンパイラはこの構文をサポートしていません.
正しい書き方:
この書き方実装は、コードをスタック領域にコピーし、特定のスタックポインタを保持し、呼び出し時にcs:ipレジスタにアドレスを付与し、blockへのジャンプ動作を実現することと本質的に異なる.
解析:ocはゲート動的言語であり、メッセージ送信メカニズムを採用し、関数の実行方法はまずオブジェクトを見つけることである->関数リストを読み取る->最適な関数ポインタをマッチングする->実行c書き方を採用する場合、第1はコンパイル時に関数の位置を確定しなければならない.第2はocのこの実現メカニズムを破壊するので、blockという設計方式を採用するのは理にかなっている.
oc関数構造体を添付
転載先:https://www.cnblogs.com/TengSys/p/8227676.html
blockについて
cとocの最大の違いは静的言語と動的言語である.
まずcの書き方を見てみましょう
void testFunc() {
printf("hello world");
}
void testFuncPoint(void) {
void (*x)(void) = testFunc;
x();
}
c言語はblockとは言わず、関数ポインタと呼ばれ、その実現メカニズムは、関数エントリが固定されていることであり、私は関数エントリを知っていれば正しく関数を呼び出すことができるので、関数アドレスを関数ポインタに割り当て、呼び出すときに直接このポインタを使えばよい.
ocを見てみましょうまずcの書き方を採用して、関数のポインタを使って関数を呼び出します
void (*functionPoint)(void) = sayHello;
///
- (void)sayHello {
NSLog(@"hello world!");
}
実験結果:構文エラーコンパイラはこの構文をサポートしていません.
正しい書き方:
TestBlock block = ^(int x) {
x++;
};
block(5);
この書き方実装は、コードをスタック領域にコピーし、特定のスタックポインタを保持し、呼び出し時にcs:ipレジスタにアドレスを付与し、blockへのジャンプ動作を実現することと本質的に異なる.
解析:ocはゲート動的言語であり、メッセージ送信メカニズムを採用し、関数の実行方法はまずオブジェクトを見つけることである->関数リストを読み取る->最適な関数ポインタをマッチングする->実行c書き方を採用する場合、第1はコンパイル時に関数の位置を確定しなければならない.第2はocのこの実現メカニズムを破壊するので、blockという設計方式を採用するのは理にかなっている.
oc関数構造体を添付
struct objc_method {
SEL _Nonnull method_name //
char * _Nullable method_types //
IMP _Nonnull method_imp //
}
転載先:https://www.cnblogs.com/TengSys/p/8227676.html