在没有实例变量的情况下删除dealloc上的委托

时间:2011-09-29 15:53:55

标签: iphone objective-c ios delegates dealloc

所以我在UIViewController中的[viewDidLoad]上启动ASIFormDataRequest。

ASIFormDataRequest *detailRequest = [ASIFormDataRequest requestWithURL:url];
detailRequest.delegate = self;
[detailRequest startAsynchronous];

如果我的UIViewController在我的请求完成之前被释放,我的应用程序崩溃了。

如果我将ASIFormDataRequest添加为实例变量,例如

@property(nonatomic, retain) ASIFormDataRequest *detailRequest;

并且在dealloc

上没有代表
-(void)dealloc {
    if(self.detailRequest != nil) { self.detailRequest.delegate = nil; }
    self.detailRequest = nil;

    [super dealloc];
}

该应用不再崩溃。

但我不认为有必要为此创建一个实例变量,特别是如果我有多个请求。

有更好的方法吗?

5 个答案:

答案 0 :(得分:1)

我通常创建一个数组并将所有活动请求存储在数组中。当请求完成后,我删除了请求,当控制器调用dealloc时,我取消所有请求并且没有代理。

答案 1 :(得分:0)

为了释放它,你必须有一个指针,所以是的,使用一个ivar。 iars并不贵。

答案 2 :(得分:0)

通过执行self.detailRequest = [ASIFormDataRequest requestWithURL:url];我猜它正在创建一个autorelease对象,其生命周期未绑定到您的控制器类。如果对象的创建和删除绑定到控制器,则使用实例变量是合乎逻辑的。

More details about autorelease

答案 3 :(得分:0)

你可以这样做:

detailRequest.delegate = [self retain];

然后致电

[self autorelease];

在ASIFormDataRequest回调方法中。无论如何,这就是我通常倾向于做的事情。

这样,请求对象在请求期间保留其委托。

答案 4 :(得分:0)

因为这是异步请求,所以如果你设置了委托,它就意味着一旦响应到来,你的委托方法就会被调用。直到那时你的对象应该活着来处理响应。所以让它在dealloc中保留和释放是好的,之前你必须将委托设置为nil。因此,如果在发布方法之后发生响应,则框架不应被误导以搜索死对象的方法。

要处理多个请求,最好的方法是创建要使用的数组和对象数。完成对象后,在dealloc方法中遍历每个对象并设置委托nil并释放对象。