私は JavaScript 指向の経験が豊富で、できる限り Objective-C に移行しています。当然のことながら、次のようなクロージャ関数をソース コードで利用する機会にいつも飛びつきます。
@property (nonatomic, retain) void (^zoomCallback)(NSInteger width, NSInteger height, NSString *url);
ただし、これを Xcode に書き出すたびに、次の警告が表示されます。
保持されたブロック プロパティはブロックをコピーしません - 代わりにコピー属性を使用してください
ARC のおかげで、Objective-C で手動で保持する必要がなくなったというのが私の理解でした。ブロックごとにクロージャー関数を参照していると仮定しているので、解釈できる限り、この変数を割り当てることがわかります。
myObject.zoomCallback = someMethod;
また、someMethod が保持されるため、someMethod の所有者が存在し続けますか? 私はそれを正しく理解しましたか?
これによる悪影響は何ですか?ブロックを「コピー」すると、 someMethod の所有者が破棄されることを許可しないので、「self」を参照するたびにクロージャーメソッド自体内に存在しなくなりますか? 私のクロージャーメソッドが非常に些細なことをしていないか、メンバー変数やメソッドを参照していないことをしていない限り、ほとんどの場合ブロックを保持したくないですか?