2017-06-13 4 views
0

Situation: La classe A (classe grand-parent) conserve la classe B (classe parente) et la classe B (classe parente) conserve la classe C (classe enfant) puis la classe B et la classe C cycle de rétention et provoquer des fuites de mémoire?Avons-nous un cycle de rétention lorsqu'une classe (milieu de la hiérarchie) est supprimée?

+0

il ne sera pas détruit parce qu'il a compte de référence 1, car il est maintenu par une classe. il va donc créer un cycle de référence fort. Plus: https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html – KKRocks

Répondre

0

Cela dépend de comment avez-vous Effacez la classe B.

Si je retirai la classe B alors ce qui se passerait

Que voulez-vous dire par là? Si vous utilisez ARC, vous n'êtes pas censé appeler le release. Alors, comment avez-vous retiré la classe B alors? Étant donné que la classe A contient la référence forte à la classe B, le nombre de retenues de la classe B est 1. Maintenant, la seule façon de ramener le compte de réfrence de la classe B à 0 et de laisser l'ARC nettoyer la classe B référence de la classe B à zéro.

Ainsi, si dans la classe A si vous dites,

self.classBReference = nil; 

Alors le nombre de références de classe B devient 0 et la classe B se évidemment désallouée et parce que la classe B sera désallouée le compte de référence de la classe C devient 0 parce que La classe C était fortement détenue par la classe B et la classe B n'existe plus. Par conséquent, la classe C devient le candidat à être retiré par ARC.

Proof Of Concept:

Voici ma déclaration de classe

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") 
    } 
} 

Maintenant, je créer une instance de la classe A dans mon CV, suite A, B et C ont tous compte de référence de 1.

var ainstance : A = A() 

Quand je mets le AINSTANCE à zéro est ici la séquence des appels

self.ainstance.binstance = nil 

O/P

B deinited

C deinited