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

Iphone 在没有实例变量的情况下删除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在我的请求完成之前被释放,我的应用程序将崩溃 例如,

因此,我在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];
}
应用程序不再崩溃

但是我认为没有必要仅仅为此创建一个实例变量,特别是当我有多个请求时


有更好的方法吗?

为了释放它,你必须有一个指向它的指针,所以是的,使用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并释放该对象