管理调用委托回调块的对象的内存

时间:2012-04-10 07:15:41

标签: objective-c cocoa objective-c-blocks grand-central-dispatch

假设我有一个ObjectA类(例如视图控制器),它执行此操作:

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

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

ObjectA可以随时解除分配,所以我应该能够取消对象B的请求,并告诉它在完成时不执行该块,对吧?简单地发布它是不够的?另外,我应该在release之后拨打executeLongRequestThenDo:吗?

1 个答案:

答案 0 :(得分:4)

不,ObjectA在任何时候都不会被取消分配 - 它会一直保留到ObjectB完成操作。

可能-[ObjectB executeLongRequestThenDo:]会在该块上调用Block_copy。这将导致块从堆栈移动到堆,并将保留块直接引用的所有NSObject,即self

完成ObjectB后,它应该运行阻止,然后调用Block_release,这将释放self。或者,如果您有某种取消操作的方法,ObjectB应该同样释放该块。

(ObjectB可能通过调用完成工作的东西来间接地完成这一切,例如dispatch_async。)

参考:Blocks Programming Topics.

至于何时释放objectB:它取决于它是否在长时间运行期间保留自身。为了安全起见,我不会发布它,直到你知道它完全完成,这将在你的块结束时,或在你调用它的取消方法之后。