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

所以我开始在我的[viewDidLoad]在UIViewController的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];
}

该应用不再崩溃。

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

有一个更好的方法吗?


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


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


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

更多关于autorelease的细节

链接地址: http://www.djcxy.com/p/30589.html

上一篇: deleting delegate on dealloc without an instance variable

下一篇: memory leak when using NSURLConnection instance