この Apple リファレンスには、objective-c のブロック オブジェクトの概念的な概要があります。
http://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Blocks/Blocks.pdf
しかし、それは私に関係があり、他の人に関係する可能性のある 2 つのトピックを実際には説明していません。最初の質問は次のようなものです: ブロック参照に nil を代入できますか? または、NULL を使用する必要がありますか? または、どちらも使用できませんか?
2 番目の問題は、メモリ管理の領域にあります。たとえば、スタック上にブロック オブジェクトを作成するメソッドを宣言しました。
-(void)makeTheClass
{
TheClass *object = [[TheClass alloc] init];
object.blockReference = ^(void) { return nil; }
}
このオブジェクトは、あるスコープ内で作成され、スコープ外に出ると破棄されます。しかし、TheClass オブジェクトは実際には、この (ほとんど破棄された) ブロックへの参照を格納しようとしています。
typedef id (^WeirdBlockType)(void);
@interface TheClass {
WeirdBlockType blockReference;
}
このようなブロックのクラス プロパティを宣言するにはどうすればよいですか? これら2つの違いは何ですか:
@property (nonatomic, retain) WeirdBlockType blockReference;
@property (nonatomic, copy) WeirdBlockType blockReference;
?
Apple のドキュメントでは、ブロック コピーはブロックをヒープに移動すると明確に述べられています。しかし、そのままにしておくとどうなるでしょうか。makeTheClass
メソッドのスコープ外に出た後、破棄されますか?