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 回答