[英]ASIHTTPRequest / ASIFormDataRequest - referencing request object within blocks under ARC
與此問題非常相似,我正在嘗試將使用ASIHTTPRequest
和ASIFormDataRequest
的項目轉換為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.