所以我在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];
}
该应用不再崩溃。
但我不认为有必要为此创建一个实例变量,特别是如果我有多个请求。
有更好的方法吗?
答案 0 :(得分:1)
我通常创建一个数组并将所有活动请求存储在数组中。当请求完成后,我删除了请求,当控制器调用dealloc时,我取消所有请求并且没有代理。
答案 1 :(得分:0)
为了释放它,你必须有一个指针,所以是的,使用一个ivar。 iars并不贵。
答案 2 :(得分:0)
通过执行self.detailRequest = [ASIFormDataRequest requestWithURL:url];
我猜它正在创建一个autorelease
对象,其生命周期未绑定到您的控制器类。如果对象的创建和删除绑定到控制器,则使用实例变量是合乎逻辑的。
答案 3 :(得分:0)
你可以这样做:
detailRequest.delegate = [self retain];
然后致电
[self autorelease];
在ASIFormDataRequest回调方法中。无论如何,这就是我通常倾向于做的事情。
这样,请求对象在请求期间保留其委托。
答案 4 :(得分:0)
因为这是异步请求,所以如果你设置了委托,它就意味着一旦响应到来,你的委托方法就会被调用。直到那时你的对象应该活着来处理响应。所以让它在dealloc中保留和释放是好的,之前你必须将委托设置为nil。因此,如果在发布方法之后发生响应,则框架不应被误导以搜索死对象的方法。
要处理多个请求,最好的方法是创建要使用的数组和对象数。完成对象后,在dealloc方法中遍历每个对象并设置委托nil并释放对象。