删除dealloc上的委托没有实例变量

问题描述:

所以我开始在我的[viewDidLoad]在UIViewController上的ASIFormDataRequest。删除dealloc上的委托没有实例变量

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]; 
} 

应用程序不再崩溃。

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

有没有更好的方法来做到这一点?

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

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

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

More details about autorelease

你可以这样做:

detailRequest.delegate = [self retain]; 

,然后调用

[self autorelease]; 

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

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

因为这是异步请求,所以如果你设置委托,它的意思是一旦响应来,你的委托方法将被调用。直到那个时候你的对象应该还活着来处理响应。所以使它在dealloc中保留和释放是很好的,在此之前您必须将代理设置为nil。因此,如果在释放方法之后出现响应,则框架不应该被误导以寻找死对象的方法。

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