Iphone 在没有实例变量的情况下删除dealloc上的委托
因此,我在UIViewController中的[viewDidLoad]上启动一个ASIFormDataRequestIphone 在没有实例变量的情况下删除dealloc上的委托,iphone,objective-c,ios,delegates,dealloc,Iphone,Objective C,Ios,Delegates,Dealloc,因此,我在UIViewController中的[viewDidLoad]上启动一个ASIFormDataRequest ASIFormDataRequest *detailRequest = [ASIFormDataRequest requestWithURL:url]; detailRequest.delegate = self; [detailRequest startAsynchronous]; 如果我的UIViewController在我的请求完成之前被释放,我的应用程序将崩溃 例如,
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];
}
应用程序不再崩溃
但是我认为没有必要仅仅为此创建一个实例变量,特别是当我有多个请求时
有更好的方法吗?为了释放它,你必须有一个指向它的指针,所以是的,使用ivar。IAR并不昂贵。为了释放它,你必须有一个指向它的指针,所以是的,使用ivar。IAR并不昂贵。我通常创建一个数组,并将所有活动请求存储在该数组中。当请求完成时,我删除请求,当控制器调用dealloc时,我取消所有请求并取消委托。我通常创建一个数组并将所有活动请求存储在数组中。当请求完成时,我删除请求,当控制器调用dealloc时,我取消所有请求并取消委托。通过执行
self.detailRequest=[ASIFormDataRequest requestWithURL:url]
我猜它正在创建一个自动释放
对象,它的生命周期不受控制器类的约束。如果对象的创建和删除绑定到控制器,则使用实例变量是合乎逻辑的
通过执行
self.detailRequest=[AsiformDataRequestRequestWithURL:url]
我猜它正在创建一个自动释放
对象,它的生命周期不受控制器类的约束。如果对象的创建和删除绑定到控制器,则使用实例变量是合乎逻辑的
您可以这样做:
detailRequest.delegate = [self retain];
然后打电话
[self autorelease];
在ASIFormDataRequest回调方法中。不管怎样,我通常都会这么做
这样,请求对象将在请求期间保留其委托。您可以这样做:
detailRequest.delegate = [self retain];
然后打电话
[self autorelease];
在ASIFormDataRequest回调方法中。不管怎样,我通常都会这么做
这样,请求对象将在请求期间保留其委托。因为这是异步请求,所以如果设置委托,则意味着一旦收到响应,就会调用委托方法。在此之前,您的对象应该处于活动状态以处理响应。因此,在dealoc中保留并释放它是很好的,在此之前,您必须将delegate设置为nil。所以,若响应是在发布方法之后出现的,那个么框架就不应该被误导来搜索死对象的方法
要处理多个请求,最好的方法是创建要使用的数组和对象数。处理完对象后,在dealloc方法中,遍历每个对象并设置delegate nil并释放该对象。因为这是异步请求,所以如果设置delegate,则意味着一旦收到响应,就会调用您的委托方法。在此之前,您的对象应该处于活动状态以处理响应。因此,在dealoc中保留并释放它是很好的,在此之前,您必须将delegate设置为nil。所以,若响应是在发布方法之后出现的,那个么框架就不应该被误导来搜索死对象的方法 要处理多个请求,最好的方法是创建要使用的数组和对象数。处理完对象后,在dealloc方法中,遍历每个对象并设置delegate nil并释放该对象