【发布时间】:2012-10-08 17:39:51
【问题描述】:
在将项目转换到 ARC 后,我遇到了一些问题,即委托方法未在已释放的实例上被调用/被调用。我已经意识到问题是我有一个变量被分配然后执行一个异步任务。举个简单的例子,假设有一个名为 MyService 的对象响应委托方法 executeDidSucceed:
- (void)fireRequest {
MyService *service = [[MyService alloc] initWithDelegate:self];
[service execute];
}
原始代码如下所示:
- (void)fireRequest {
MyService *service = [[[MyService alloc] initWithDelegate:self] autorelease];
[service execute];
}
对于 ARC,我了解在调用 [service execute] 之后会添加 release 调用。而且我也明白,因为该方法是异步的,service 对象将被释放,并且将为委托方法调用已释放对象。
我知道一个解决方案是让service 成为一个实例变量并赋予它strong 属性,这样我们就可以保留它的所有权。而且我知道一个解决方案,我们可以创建一个块并使用完成处理程序,以便委托保持保留,直到块完成。我的问题是,处理这种情况的最佳方法是什么?或者更重要的是,在过渡到 ARC 时解决此问题的“最佳做法”是什么?
【问题讨论】:
-
你能使用自动归零弱引用吗?
-
不清楚从哪里调用委托方法。 MyService 甚至会在之前被释放,因为它是自动释放的。旧版本和 ARC 版本之间的唯一区别是 autorelease 与 release。我不明白为什么一个人会调用委托而一个人不会 - 在旧的自动释放池耗尽之前是否碰巧调用了异步方法?我认为最终的答案是使用一个强大的属性,一旦被回调就被代表取消。
-
是的,我相信该方法确实会在池耗尽之前被调用。
-
问题和答案很简单:您希望您的对象所有权图是什么样的?
标签: objective-c ios automatic-ref-counting