在没有实例变量的情况下删除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