0

これはアップルブロックのドキュメントからのものであり、私はこれを理解するのに苦労しています。誰かが少し簡単な方法で説明できますか?

...任意の型のポインタへのブロック参照をキャストでき、その逆も可能です。ただし、ポインター逆参照演算子(*)を使用してブロック参照を逆参照することはできません。したがって、コンパイル時にブロックのサイズを計算することはできません。

4

1 に答える 1

3

簡単に言えば、ブロックは参照です。ブロック内のコードはメモリに保存され、変数を介してアクセスできます。void (^addingBlock)(int);はブロック宣言であり、addingBlock変数を介してアクセスできます(のように、のように呼び出すことができますaddingBlock(5);)。

これで、この参照は、Cが認識するポインター型に変換できます。関数ポインタのようなものです。ドキュメントに記載されているように、視覚的な違いは、の*代わりにを使用することだけです^。これは、ブロックを関数ポインタにキャストできることを意味します。

void (*funcPointer)(int) = (void(*)(int))addingBlock;

または、voidポインタ(または任意のタイプ!)

void* voidPtr = (void*)addingBlock;

しかし、あなたが提供している引用は、ブロックへのこのポインターでは、それを「逆参照」できないということです。これは、ポインタアドレスを解釈し、そのアドレスの背後にあるデータを取得することを意味します。これを実行できないということは、コンパイル時にそのサイズを判別できないことを意味します。

なんで?Obj-Cの動的性のため。ブロックの内容は実行時にのみ決定できますが、Cは本質的にかなり静的であり、コンパイル時に多くを決定します。

于 2012-10-23T14:51:09.157 に答える