3

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

4

1 回答 1

4

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

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

于 2012-10-08T18:25:21.460 回答