转换到ARC会导致委托问题

时间:2012-10-08 17:39:52

标签: objective-c ios automatic-ref-counting

在将项目转换为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,我了解在release被调用后会添加[service execute]次调用。我也理解,因为该方法是异步的,service对象将被释放,并且将为委托方法调用释放的对象。

我知道一个解决方案是让service成为一个实例变量并赋予它strong属性,这样我们就可以保留它的所有权。我知道一个解决方案,我们可以创建一个块并使用完成处理程序,以便委托保持不变直到块完成。我的问题是,处理这种情况的最佳方法是什么?或者更重要的是,在转换到ARC时解决这个问题的“最佳实践”是什么?

1 个答案:

答案 0 :(得分:4)

您需要将Myservice对象作为此类的成员。 ARC在此功能完成后立即清理它,因为您不再有对它的引用。

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