2010-01-29 31 views
3

我試圖用ASIHTTPRequest做一個異步請求,但在請求完成時有一些問題得到通知。ASIHTTPRequest,EXC_BAD_ACCESS當請求完成時

-(void)doDownload{ 
    NSURL *url = [NSURL URLWithString:@"http://www.someurl.com/?"]; 
    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; 
    [request setPostValue:@"someValue" forKey:@"someField"]; 
    [request setRequestMethod:@"POST"]; 

    [request setDelegate:self]; 
    [request setDidFinishSelector:@selector(requestFinished)]; 
    [request startAsynchronous]; 
} 

- (void)requestFinished:(ASIHTTPRequest *)request 
{ 
    // Use when fetching text data 
    NSString *responseString = [request responseString]; 

} 

requestFinished永遠不會被調用。我在ASIHTTPRequest.m中得到了一個異常,--handleStreamCompleted:

if (fileError) { 
    [self failWithError:fileError]; 
} else { 
    [self requestFinished]; <----- this call fails 
} 

任何線索?

回答

7

當請求結束時,你確定實現- (void)requestFinished:(ASIHTTPRequest *)request的類仍然存在嗎?在我看來,這個班很早就被釋放了。請注意,delegate屬性不保留其內容。

你可以添加一個[self retain]doDownload[self release]- (void)requestFinished:(ASIHTTPRequest *)request,但要確保(!),其[self release]不會被調用過於頻繁。如果請求永遠不會完成,這也是可能的內存泄漏。最好是在其他地方保留你的課程。

您也可以嘗試使用設置爲YESNSZombieEnabled進行調試以查找錯誤。

+0

這似乎是正確的答案。我有一個需要解決的終生管理問題。現在,我創建一個下載類,調用一個方法,並立即發佈。我必須實現一些回調系統,讓下載實例所有者知道什麼時候完成。我最終會以任何方式需要這個,以隱藏進度視圖和更新數據等。謝謝。 – Vegar 2010-01-29 23:09:25

+0

如何在使用ARC運行時執行此操作?請參閱我的[topic here](http://stackoverflow.com/questions/8355974)。 – dhrm 2011-12-02 13:20:01

+0

託什。 @tomute是正確的,選擇器的名稱是requestFinished:,而不是requestFinished,這就是整個問題。沒有必要在生命週期和保留內容上打破你的頭腦。 – 2011-12-28 21:14:33

0

[request responseString];

請在此通話前檢查請求的retainCount。顯然它等於零:)如果是這樣 - 當你在doDownload方法中創建它時,你不應該忘記保留它。

+0

我無法在requestFinished中檢查請求retainCount,因爲requestFinished永遠不會被調用。 – Vegar 2010-01-29 20:53:51

4

您的代碼的以下行似乎是錯誤的。

[request setDidFinishSelector:@selector(requestFinished)]; 

requestFinished方法有一個參數(ASIHTTPRequest *)。
因此,您應該添加「:」,當您像下面這樣設置選擇器時。

[request setDidFinishSelector:@selector(requestFinished:)]; 
+0

我會接受你的話;-)謝謝。 – Vegar 2010-01-29 23:10:58

相關問題