2017-06-13 3 views
0

状況:クラスA(祖父母クラス)はクラスB(親クラス)を保持し、クラスB(親クラス)はクラスC(子クラス)を保持する。次にクラスBを削除した場合、何が起こるかクラスAおよびクラスCは保持サイクルとメモリリークの原因になりますか?私はクラスBを削除した場合クラス(中間の階層)が削除されたときの保持サイクルはありますか?

+0

をdeinited。それは強い参照サイクルを作成します。その他:https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html – KKRocks

答えて

0

がどのようにクラスB

を削除しなかった

に依存し、次に何が起こるか

あなたは何を意味するのですか? ARCを使用している場合は、releaseに電話をかけることはできません。だから、どうやってクラスBを削除したのですか?

クラスAはクラスBの強い参照を保持しているので、クラスBの保持カウントは1です。クラスBのリフレクションカウントを0にし、クラスBをクリーンにする唯一の方法は、クラスBのnilへの参照。

そう、あなたが言うならば、あなたのクラス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") 
    } 
} 

は今、私は結果Aとして、B及びCは、すべての参照カウントを持つことになり、私のVCでクラスAのインスタンスを作成しています1.

var ainstance : A = A() 

私はnilにainstanceを設定すると、ここでの通話

のシーケンスがあるの
self.ainstance.binstance = nil 

O/P

Bは

をdeinited Cは、それがクラスAによって保持されているので、それは参照カウント1を持っているので、それは破壊されないであろう

関連する問題