假设我有一个ObjectA类(例如视图控制器),它执行此操作:
ObjectB *objectB = [[ObjectB alloc] init];
[objectB executeLongRequestThenDo:^ (NSDictionary *results)
{
self.datasource = results;
[self.tableView reloadData];
}];
ObjectA可以随时解除分配,所以我应该能够取消对象B的请求,并告诉它在完成时不执行该块,对吧?简单地发布它是不够的?另外,我应该在release
之后拨打executeLongRequestThenDo:
吗?
答案 0 :(得分:4)
不,ObjectA
在任何时候都不会被取消分配 - 它会一直保留到ObjectB
完成操作。
可能-[ObjectB executeLongRequestThenDo:]
会在该块上调用Block_copy
。这将导致块从堆栈移动到堆,并将保留块直接引用的所有NSObject
,即self
。
完成ObjectB
后,它应该运行阻止,然后调用Block_release
,这将释放self
。或者,如果您有某种取消操作的方法,ObjectB
应该同样释放该块。
(ObjectB可能通过调用完成工作的东西来间接地完成这一切,例如dispatch_async
。)
至于何时释放objectB
:它取决于它是否在长时间运行期间保留自身。为了安全起见,我不会发布它,直到你知道它完全完成,这将在你的块结束时,或在你调用它的取消方法之后。