1

これを行うクラスObjectA(たとえば、ビューコントローラー)があるとします:

ObjectB *objectB = [[ObjectB alloc] init];

[objectB executeLongRequestThenDo:^ (NSDictionary *results)
 {
     self.datasource = results;
     [self.tableView reloadData];
 }];

ObjectA はいつでも割り当てを解除できるので、objectB の要求をキャンセルして、完了時にブロックを実行しないように指示できるはずですよね? リリースするだけでは不十分ですか?releaseまた、直後に電話したほうがexecuteLongRequestThenDo:いいですか?

4

1 に答える 1

4

いいえ、ObjectAいつでも割り当て解除されることはありませんObjectB。操作が完了するまで保持されます。

おそらくブロック-[ObjectB executeLongRequestThenDo:]を呼び出すでしょう。Block_copyこれにより、ブロックがスタックからヒープに移動されNSObject、ブロックが直接参照するすべての s、つまりが保持されますself

が完了するObjectBと、ブロックが実行され、 が呼び出さBlock_releaseれて が解放されselfます。または、操作をキャンセルする方法がある場合は、ObjectB同様にブロックを解放する必要があります。

(ObjectB は、 のような作業を行うものを呼び出すことによって、これをすべて間接的に行う可能性がありますdispatch_async。)

参照:ブロック プログラミングのトピック。

いつリリースする必要があるobjectBかについては、長時間実行されている操作中にそれ自体を保持するかどうかによって異なります。安全のために、完全に完了したことがわかるまで、つまりブロックの最後になるか、キャンセル メソッドを呼び出した後まで、私はそれを解放しません。

于 2012-04-10T07:29:53.400 に答える