ブロックオブジェクト
Mac OS X 10.6 および iOS 4.0 で利用できるようになった C 言語の機能
Apple が提案しているもので、一般的に使えるわけではない
Objective-C のプログラムとしてコンパイルした場合、ブロックは Objective-C のオブジェクトになる
記法
変数宣言 : returnType (^name)(argType1, argType2)
ブロックリテラル : ^(引数列) { 本体 }
Objective-C のメソッド宣言 : - (void) sampleMethodWithBlock: (returnType (^)(argType1, argType2)) block
nobuoka.icon Apple のドキュメントを見ても、「ブロック」 という呼称しかない ブロックオブジェクトという呼称は古いものかも?
ブロック内から参照可能な外部のローカル変数のうち、自動変数についてはブロックリテラルが記述された時点での値が保存され、それが参照される (キャプチャ)
ブロック内から、ブロック外の自動変数の値の変更はできない
関数内に定義されたブロックは、関数内の自動変数と同じくスタックに積まれる = 関数が実行されている間しか存在しない
→ 関数外にブロックの参照を渡して後から使うとおかしくなるっぽい?
ブロックをヒープに確保するための関数がある
Block_copy と Block_release
ARC が有効であれば、特定条件においてはコンパイラが自動的に copy メソッドを挿入してくれる Block_copy や Block_release を使ってはいけない
__block 修飾子