将项目转换到 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 时解决此问题的“最佳实践”是什么?