一:為什麼造成了迴圈引用??????????????????????????
首先
對於網路工具類 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...