簡體   English   中英

ASIHTTPRequest / ASIFormDataRequest-在ARC下的塊內引用請求對象

[英]ASIHTTPRequest / ASIFormDataRequest - referencing request object within blocks under ARC

此問題非常相似,我正在嘗試將使用ASIHTTPRequestASIFormDataRequest的項目轉換為ARC。

在我的視圖控制器類中,我經常在完成塊中引用和使用request對象的屬性(查看響應代碼,響應數據等):

__block  ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:SOME_URL]];    
[request setCompletionBlock:^{   

    if([request responseStatusCode] == 200) ....etc

轉換為ARC時,出現警告:

在此區塊中強烈捕獲“請求”可能會導致保留周期

正確的方法是什么?

另一個SO用戶在上一個線程中指出,僅添加__weak可能會導致請求在塊完成之前被釋放,我相信這是事實。

如何在ARC下的完成/失敗塊中正確引用這些屬性?

(我閱讀了您對另一個問題的評論)

在使用ASIHTTPRequest實現更多模塊ASIHTTPRequest ,我了解到最好的方法是保持對請求對象的strong引用。 就您而言,您可以執行以下操作:

self.request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:SOME_URL]];
__weak ASIFormDataRequest *weakRequest = self.request; // __block directive not needed since we only access the instance's properties. 
[self.request setCompletionBlock:^{   

    if([weakRequest responseStatusCode] == 200)
    // ...

這樣,即使啟動請求后,您仍然可以控制self.request (例如,取消)。 你可以做self.request = nil; 當您准備好釋放請求時,可能在您的完成塊或self.request的父對象的清除方法中。

更新:

如果您的目標是iOS 5之前的版本,那么通常的立場是:使用__unsafe_unretained而不是__weak 這是可以的,因為看着ASIHTTPRequest.m ,塊是nil “編輯出其dealloc()即他們不應該得到執行)。 盡管我還沒有測試過,但是請確保仍啟用NSZombies進行測試。

注意:

取消ASIHTTPRequest對象的唯一安全方法是調用其clearDelegatesAndCancel方法。 當我只使用普通的cancel時,我就被一些討厭的錯誤所咬。

如果您要定位5.0之前的iOS版本,則不包括weak支持:

__unsafe_unretained __block ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];

我發現此答案會有所幫助: https : //stackoverflow.com/a/7735770/133875

它說使用__unsafe_unretained__block

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM