2017-06-13 26 views
0

情況:A類(祖父類)保留B類(父類)和B類(父類)保留C類(孩子類),那麼如果我刪除B類,那麼會發生什麼,A類和C類是否有保留週期並導致內存泄漏?當一個班級(層級中)被刪除時,我們是否有一個保留週期?

+0

它不會破壞,因爲它具有引用計數1,因爲它是由類保持。所以它會創建強大的參考週期。更多:https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html – KKRocks

回答

0

要看你怎麼去除B類

如果我刪除了B類,然後會發生什麼

你是什麼意思?如果您使用ARC,則不應撥打release。那麼你是如何取消B班的?

由於A類持有的強引用B類,B類的保留計數爲1。現在,你可以把B級的refrence計數爲0,讓B圓弧清潔類的唯一途徑是通過設置強B類參考無。

所以,如果你的A類,如果你說,

self.classBReference = nil; 

那麼B類的引用計數爲0,顯然B類被釋放並且由於B類被釋放的C類的引用計數爲0,因爲C級被B級牢牢佔據,B級不再存在。因此,C類現在成爲ARC要刪除的候選人。

概念證明:

這裏是我的班宣言

class A { 
    var binstance : B? = B() //Declared as optional because I need to set the reference to nil later :) 

    deinit { 
     print("A deinited") 
    } 
} 

class B { 
    var cinstance = C() 

    deinit { 
     print("B deinited") 
    } 
} 

class C { 
    deinit { 
     print("C deinited") 
    } 
} 

現在我在VC創建類的實例,因此A,B和C都將具有引用計數1.

var ainstance : A = A() 

當我設置AINSTANCE爲零這裏是電話

序列
self.ainstance.binstance = nil 

O/P

乙deinited

Çdeinited

相關問題