gpt4 book ai didi

objective-c - 管理调用委托(delegate)回调 block 的对象的内存

转载 作者:行者123 更新时间:2023-12-03 16:55:12 24 4
gpt4 key购买 nike

假设我有一个 ObjectA 类(例如 View Controller ),它可以执行以下操作:

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

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

ObjectA 可以随时释放,所以我应该能够取消 objectB 的请求,并告诉它在完成后不要执行该 block ,对吧?仅仅释放它还不够吗?另外,我应该在 executeLongRequestThenDo: 之后调用 release 吗?

最佳答案

不,ObjectA 不会在任何时候被释放——它将被保留,直到 ObjectB 完成操作。

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

ObjectB完成后,它应该运行该 block ,然后调用Block_release,这将释放self。或者,如果您有某种方法取消操作,ObjectB 应该类似地释放该 block 。

(ObjectB 可能会通过调用执行该工作的方法(例如 dispatch_async)来间接完成这一切。)

引用:Blocks Programming Topics.

至于何时应该释放objectB:这取决于它在长时间运行的操作期间是否保留自身。为了安全起见,在您知道它完全完成之前(这将在您的 block 的末尾,或者在您调用其取消方法之后),我不会释放它。

关于objective-c - 管理调用委托(delegate)回调 block 的对象的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10084607/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com