2011-09-29 28 views
1

所以我開始在我的[viewDidLoad]在UIViewController上的ASIFormDataRequest。刪除dealloc上的委託沒有實例變量

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]; 
} 

應用程序不再崩潰。

但我不認爲有必要爲此創建一個實例變量,特別是如果我有多個請求。

有沒有更好的方法來做到這一點?

回答

1

我通常會創建一個數組並將所有活動請求存儲在數組中。當請求完成時,我刪除請求,並且當控制器調用dealloc時,我取消所有的請求,並刪除委託。

0

爲了釋放它,你必須有一個指針,所以是的,使用伊娃。 iars並不昂貴。

0

通過做self.detailRequest = [ASIFormDataRequest requestWithURL:url];我猜測它創建的autorelease對象的生命週期不綁定到您的控制器類。如果創建和刪除對象綁定到您的控制器,則使用實例變量是合乎邏輯的。

More details about autorelease

0

你可以這樣做:

detailRequest.delegate = [self retain]; 

,然後調用

[self autorelease]; 

在ASIFormDataRequest回調方法。無論如何,這就是我一般傾向於做的事情。

這樣,請求對象在請求期間保留其委託。

0

因爲這是異步請求,所以如果你設置委託,它的意思是一旦響應來,你的委託方法將被調用。直到那個時候你的對象應該還活着來處理響應。所以使它在dealloc中保留和釋放是很好的,在此之前您必須將代理設置爲nil。因此,如果在釋放方法之後出現響應,則框架不應該被誤導以尋找死對象的方法。

要處理多個請求,最好的方法是創建要使用的數組和數量的對象。當你完成對象時,在dealloc方法中遍歷每個對象並設置委託nil並釋放對象。