删除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
对象的生命周期不绑定到您的控制器类。如果创建和删除对象绑定到您的控制器,则使用实例变量是合乎逻辑的。
你可以这样做:
detailRequest.delegate = [self retain];
,然后调用
[self autorelease];
在ASIFormDataRequest回调方法。无论如何,这就是我一般倾向于做的事情。
这样,请求对象在请求期间保留其委托。
因为这是异步请求,所以如果你设置委托,它的意思是一旦响应来,你的委托方法将被调用。直到那个时候你的对象应该还活着来处理响应。所以使它在dealloc中保留和释放是很好的,在此之前您必须将代理设置为nil。因此,如果在释放方法之后出现响应,则框架不应该被误导以寻找死对象的方法。
要处理多个请求,最好的方法是创建要使用的数组和数量的对象。当你完成对象时,在dealloc方法中遍历每个对象并设置委托nil并释放对象。