【问题标题】:Transitioning to ARC causing delegate issues过渡到 ARC 导致代理问题
【发布时间】: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


【解决方案1】:

您需要让您的 Myservice 对象成为此类的成员。 ARC 会在此函数完成后立即对其进行清理,因为您不再拥有对它的引用。

我也认为这是一个很好的做法,因为在它调用委托(如果有的话)之前您没有对该对象的引用,并且根据具体情况,您可能需要在服务完成之前停止服务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-22
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多