1

我有一個單獨的類我想處理來自ASIHTTPRequest的響應,所以我創建了一個類的實例,然後將它傳遞給我的請求。問題是我的委託類在請求結束之前被釋放。didFinishSelector的自定義委託類ASIHTTPRequest被釋放之前被稱爲

我正在使用ARC。我如何確保代表保留爲didFinish/didFail選擇器?

-(void)getStuff 
{ 
    NSURL *url = [NSURL URLWithString:@"http://example.com/json"]; 
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 

    UpdateFeedDelegate *updateFeedDelegate = [[UpdateFeedDelegate alloc] init]; 

    [request setDelegate:updateFeedDelegate]; 
    [request setDidFinishSelector:@selector(updateTestDone:)]; 
    [request setDidFailSelector:@selector(getSingleUpdateFeedBackgroundRequestFailed:)]; 

    [request startAsynchronous]; 
} 

在此示例中,選擇器類按預期方式存在。我得到的錯誤:

*** -[UpdateFeedDelegate respondsToSelector:]: message sent to deallocated instance 0x56efb50

*** NSInvocation: warning: object 0x56efb50 of class '_NSZombie_UpdateFeedDelegate' does not implement methodSignatureForSelector: -- trouble ahead

*** NSInvocation: warning: object 0x56efb50 of class '_NSZombie_UpdateFeedDelegate' does not implement doesNotRecognizeSelector: -- abort

回答

2

代表通常由weakassign性質舉行。您需要在某個地方持有strongretain對您的UpdateFeedDelegate的引用,以便它不會被自動發佈。通常,我在創建請求和委託的類中保存這個。

+1

謝謝。因爲我一次可能有很多請求,並且我需要爲每個請求使用一個新的委託對象,並且據我瞭解,默認情況下,所有實例變量和局部變量都是強指針,我仍然不確定如何實現此目的。我不能使用強大的財產,因爲我不知道我需要多少財產。 – 2012-08-03 15:31:34

+1

在這種情況下使用「NSMutableArray」或「NSMutableDictionary」,它們對其成員擁有強烈的引用 – 2012-08-03 15:35:25

+0

完美。謝謝。 – 2012-08-03 15:43:25

相關問題