0

我寫了一個示例代碼來建立服務器連接。請找到我在下面寫的代碼。弱自己越來越零,但我想在塊內使用自我對象

__weak typeof(self) weakSelf = self; 
self.dataTask = [defaultSession dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) 
{ 
    weakSelf.dataTask = nil; 
    NSInteger extractionResponseCode = [((NSHTTPURLResponse *)response) statusCode]; 
    if (!error && data.length > 0 && extractionResponseCode == 200) 
    { 
     [weakSelf handleResponse:data]; 
    } 
    else 
    { 
     [weakSelf handleError:error]; 
    } 
}]; 

讓我要麼handleResponse:handleError:基於響應調用響應後。

我已經採取weakSelf來避免ARC中的保留週期問題。

我在這裏的問題是內部的塊weakSelf越來越爲無這樣既不handleResponse:也不handleError:方法被調用。

能否請你幫我,我怎麼能解決這個問題?

在此先感謝。

回答

2

答案是捕捉一個有力的參考。無論如何,你還沒有保留週期,除非self提及完成塊。無論如何,當該塊返回時,強大的參考將會被釋放,如果你碰巧有一個,這將會打破循環。

0

這個想法是,下載數據不應該讓你的對象活着。如果您的對象在下載運行時消失(例如,如果用戶從屏幕切換導致下載到其他屏幕),那麼您應該忽略結果並將其扔掉,或者將其存儲到文件中,但應該讓自己變成零。

這與參考週期無關:自我最終消失如果你不使用weakSelf,但你不應該保持它的存活時間超過需要。最糟糕的情況是,你可能會向用戶顯示一個錯誤提醒,告訴用戶一個早已消失的屏幕。失敗的URL請求可能需要60秒才能失敗,所以用戶可能已經完成了一些完全不同的事情。

使用weakSelf的正確方法是將其分配給您的回調中的新變量strongSelf,然後檢查它是否爲零。直接使用weakSelf是不好的,因爲它隨時會變成零。

0

我真的不知道,爲什麼人們認爲你需要每次weakify自你抓住它。

由於術語保留週期說,如果您有引用持有第一個引用的對象(直接或通過其他許多引用)的對象的引用,則只能有一個引用。

因此,如果塊上下文引用self,那麼您有參考週期,當且僅當該塊由self引用時。 (順便說一下:這適用於每一個(強)參考。Objective-C中的self並沒有什麼特別的地方,)沒有。 防止保留週期是沒有理由弱化self你的情況。

但是,有些想減弱它,使selfnil在這種情況下。這是意圖。在某些情況下,這可能是一個優點:只需考慮下載數據的模型對象。沒有理由讓它活着。

如果你不希望出現這種情況,根本就沒有weakify self。它那簡單。