iOS中迴圈引用的解除

2022-09-03 09:06:08 字數 2521 閱讀 4798

一:為什麼造成了迴圈引用??????????????????????????

首先    

對於網路工具類  finishedblock裡面 的乙個屬性是 copy的

那麼 networktools 會對網路工具 finishedblock進行乙個強引用

左邊的控制器viewcontroller裡面 

viewcontroller 對 networktools物件 tools進行強引用 

在右邊有乙個 self.finishedblock = finished 的賦值

在左邊的self.view     然後呢      self.finishedblock = finished  這個對self.view

進行乙個強引用    

造成了乙個閉環  finishedblock(引用)----self.view()--(self就是那個控制器器 對networktools物件 tools強引用)----tools(引用了)finshedblock

產生了乙個閉環  造成了乙個封閉的強引用 

--------結果是誰釋放不了

二:如何去打斷迴圈引用?????????????????????????

方式1:--打斷引用鏈條         方式2:--使用__weak  

方式1: 可以在左邊的控制器viewcontroller裡面去做乙個動作

這個就是破壞引用鏈條的原理

方式2: 在

在左邊新增了

// 方式2

__weak typeof(self) weakself = self;

[self.tools lodadata:^(nsstring *html) {

nslog(@"%@ %@",html,weakself.view);

新增了這樣的東西的話  我們就可以的接觸迴圈引用的

這個引用鏈條也會被破壞掉    破壞是在那個   finishedblock 對self.view的那個環節

總體思路的是:打破迴圈引用環節的任何一環就行

方法3: 使用__unsafe_unretained typeof(self) weakself = self;

__unsafe_unretained typeof(self)  weakself= self;

[self.tools lodadata:^(nsstring *html) {

nslog(@"%@ %@",html,weakself.view);

三:對__unsafe_unretained和 __weak的深度挖掘??????????????

我們在網路工具類裡面去的做乙個耗時操作去模仿網路請求延時操作

__weak是ios5.0的 

這個時候  weakself.view列印的是null  

如果非同步操作沒有完成的話,他就會釋放控制器   __weak本身是弱引用

當非同步操作執行完畢了的話 ,此時進行回到的時候  self已經被釋放了 無法再去訪問屬性   也無法呼叫方法  所以列印的是null

( 所以在點選返回的快慢不同  列印結果不同)

用__unsafe_unretained的時候   __unsafe_unretained是ios4.0推出的

程式就崩潰了     這個mrc的錯誤     壞記憶體訪問  野指標錯誤

__weak相當於 weak 不會做強引用      但是如果物件被釋放,執行位址會指向nil

mrc下面屬性的持有都是assign 不會做強引用  但是如果物件被釋放

記憶體位址還不變  此時再去呼叫 就會出現野指標的訪問

所以在開發中一般去推薦__weak    __unsafe_unretained相對於不安全

還有一種流傳出來的**

(stringself強引用 對weakself進行強引用 本意 希望在執行完**了後 繼續執行**)

但是如果的話__unsafe_unretained 換成這個  他還是會崩潰的

總體的區別:

__weak  寫法的話  self 已經被釋放   只為nil

__unsafe_unretained的話  self已經被釋放的話  就會出現野指標訪問

內部可以使用 strongself    但是沒有深惡麼卵用  

iOS迴圈引用

class viewcontroller uiviewcontroller 迴圈引用的方法 func cycliclead completionback escaping void 當物件銷毀時會呼叫 deinit oc方式 weak typeof self weakself self self.b...

iOS開發中的迴圈引用問題

nstimer經常會被作為類的成員變數,而nstimer初始化時要指定self為target,造成迴圈引用。另一方面,若timer一直處於validate的狀態,則其引用計數將始終大於0。先看一段nstimer使用的例子 arc模式 解決方案 自定義類 wsweaktimertarget h檔案 i...

iOS 看穿迴圈引用

我們在寫程式的時候 閉包能夠使 更加的簡潔 相信大家都用過mjrefresh吧 下拉重新整理 666 configuretableview tableview configuretableview alloc initwithframe cgrectzero style uitableviewsty...