在将项目转换为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时解决这个问题的“最佳实践”是什么?
答案 0 :(得分:4)
您需要将Myservice对象作为此类的成员。 ARC在此功能完成后立即清理它,因为您不再有对它的引用。
我还认为这是一个很好的做法,因为在调用委托之前你没有对该对象的引用(如果有的话)并且根据情况你可能需要在服务完成之前停止服务。