说我有一个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/

10-15 08:17