ios delegate迴圈引用

2021-07-04 19:44:49 字數 554 閱讀 4338

所有的引用計數系統,都存在迴圈應用的問題。例如下面的引用關係:

• 物件a建立並引用到了物件b.

• 物件b建立並引用到了物件c.

• 物件c建立並引用到了物件b.

這時候b和c的引用計數分別是2和1。當a不再使用b,呼叫release釋放對b的所有權,因為c還引用了b,所以b的引用計數為1,b不會被釋放。b不釋放,c的引用計數就是1,c也不會被釋放。從此,b和c永遠留在記憶體中。

這種情況,必須打斷迴圈引用,通過其他規則來維護引用關係。比如,我們常見的delegate往往是assign方式的屬性而不是retain方式 的屬性,賦值不會增加引用計數,就是為了防止delegation兩端產生不必要的迴圈引用。如果乙個uitableviewcontroller 物件a通過retain獲取了uitableview物件b的所有權,這個uitableview物件b的delegate又是a, 如果這個delegate是retain方式的,那基本上就沒有機會釋放這兩個物件了。自己在設計使用delegate模式時,也要注意這點。

因為迴圈引用而產生的記憶體洩露也是instrument無法發現的,所以要特別小心。

ios delegate的語法注意

1 屬性或者成員變數中不能加括號 property nonatomic,weak id delegate 這個寫法中id不能加小括號,比如 id 語法是不正確的。2 在作為函式引數中需要加小括號 ios中函式引數的型別是用小括號的,所以delegate的尖括號外也需要有小括號 比如下面 1 nsst...

迴圈引用問題

main.m 07 迴圈引用 created by kevin on 13 8 9.1.class的作用 僅僅告訴編譯器,某個名稱是乙個類 class person 僅僅告訴編譯器,person是乙個類 2.開發中引用乙個類的規範 1 在.h檔案中用 class來宣告類 2 在.m檔案中用 impo...

迴圈引用問題

3 迴圈的retain 問題人有寵物 狗 狗有主人 人 那麼使用在使用兩個類時,再用 import相互匯入 就會有問題 需要使用 class 但是當兩個類都要引用對方的物件進入自己的類做屬性時,記憶體洩露的另一種情況。解決辦法 其中乙個先釋放 但是還有殭屍物件的問題 另乙個解決辦法是乙個用 reta...