4

私は 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」を参照するたびにクロージャーメソッド自体内に存在しなくなりますか? 私のクロージャーメソッドが非常に些細なことをしていないか、メンバー変数やメソッドを参照していないことをしていない限り、ほとんどの場合ブロックを保持したくないですか?

4

1 に答える 1

3

ブロックはスタック上に作成され、ヒープに移動する必要があるため、ブロックは格納される前に (場合によっては使用する直前に) コピーする必要があります。ブロックがコピーされず、ブロックが作成されたコンテキストが破棄された場合、常に適切に機能するとは限りません。これは、ブロックが (渡されたパラメーターのみを使用するのではなく) 一部の外部変数をキャプチャする場合です。

于 2013-08-04T08:13:11.633 に答える