说我有一个ObjectA类(例如,一个视图控制器),它是这样做的:
ObjectB *objectB = [[ObjectB alloc] init];
[objectB executeLongRequestThenDo:^ (NSDictionary *results)
{
self.datasource = results;
[self.tableView reloadData];
}];
可以随时释放ObjectA,所以我应该能够取消objectB的请求,并告诉它不要在完成时执行该块,对吗?仅仅释放它是不够的?另外,我应该在
release
之后打executeLongRequestThenDo:
吗? 最佳答案
不会,ObjectA
不会在任何时候被释放-它将保留直到操作完成ObjectB
为止。-[ObjectB executeLongRequestThenDo:]
可能会在块上调用Block_copy
。这将导致该块从堆栈移到堆,并保留该块直接引用的所有NSObject
,即self
。
完成ObjectB
后,它应运行该块,然后调用Block_release
,这将释放self
。或者,如果您有某种取消操作的方法,ObjectB
应该类似地释放该块。
(通过调用诸如dispatch_async
之类的工作,ObjectB可能会间接地完成所有操作。)
参考:Blocks Programming Topics.
至于何时释放objectB
:这取决于它在长时间运行过程中是否保留自身。为了安全起见,我不会发布它,直到您知道它已完全完成,这将在您的代码块的末尾或您调用了它的取消方法之后。
关于objective-c - 管理调用委托(delegate)回调块的对象的内存,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10084607/