web-dev-qa-db-fra.com

Nombre de références en ARC

J'ai un peu de confusion dans le nombre de références ARC pouvez-vous s'il vous plaît me dire quel sera le nombre de références du code ci-dessous.

var vc1 = UIViewController()
var vc2 = vc1
var vc3 = vc2
weak var vc4 = vc3

La question est quelle sera la:

  • nombre de références de vc1?
  • nombre de références de vc2?
  • nombre de références de vc3?
  • nombre de références de vc4?
18
jignesh Vadadoriya

Ici, vc1, vc2, vc3 se rapportent au même objet. Ainsi, le compte de référence de cet objet est 3. Lorsque vc4 fait référence au même objet, puisqu'il s'agit d'une référence faible, le compte de référence ne sera pas incrémenté de 1. Le compte de référence suivant sera également égal à 3.

  1. Le nombre de références de l'objet UIViewController créé et référencé par vc1 après la première ligne de code est égal à 1.

    var vc1:UIViewController? = UIViewController() // strong reference 
    
  2. Après vc2 se réfère au même objet que vc1. Le compte de référence de l'objet passe à 2

    var vc2:UIViewController? = vc1 // strong reference
    
  3. Après vc3 se réfère au même objet que vc1 et vc2. Le compte de référence de l'objet passe à 3

    var vc3:UIViewController? = vc2 // strong reference
    
  4. Après vc4 se réfère au même objet que vc1, vc2 et vc3. Puisque vc4 est une référence faible, le nombre de références ne sera pas incrémenté. Cela signifie que le compte est toujours 3.

    weak var vc4:UIViewController? = vc3 // weak reference
    

Qu'est-ce que cela signifie:

Exécutez le code suivant.

   vc1 = nil; // reference count = 3-1 = 2
   vc2 = nil; // reference count = 2-1 = 1
   vc3 = nil; // reference count = 1-1 = 0 and object is destroyed

Imprimez maintenant la valeur de vc4. Ce sera nil. Cela est dû au fait que le nombre de références d'objet passe à zéro et que toutes les variables font référence au même objet.

Modifier:

Utiliser CFGetRetainCount dans le code ci-dessous donne les résultats suivants, comme indiqué ici:

var vc1:NSDate? = NSDate()
print(CFGetRetainCount(vc1)) // 2 - I expected this to be 1 as only one variable is strongly referring this object. 

var vc2:NSDate? = vc1
print(CFGetRetainCount(vc1)) // 3 - reference count incremented by 1 (strong reference)

var vc3:NSDate? = vc2
print(CFGetRetainCount(vc3)) // 4 - reference count incremented by 1 (strong reference)

weak var vc4:NSDate? = vc1
print(CFGetRetainCount(vc1)) // 4 - reference count not incremented (weak reference)

vc1 = nil
print(CFGetRetainCount(vc2)) // 3 - reference count decremented by 1 (strong reference removed)

vc2 = nil
print(CFGetRetainCount(vc3)) // 2 - reference count decremented by 1 (strong reference removed)

vc3 = nil 
print(vc4) // nil - reference count should be decremented by 1 (last strong reference removed)

// Also due to the final line vc3 = nil, reference count should become zero
// However, we can't use `CFGetRetainCount` to get reference count in this case
// This is due to the final strong reference being removed and object getting destroyed

La raison pour laquelle CFRetainCount donne 2 dans la 1ère ligne a été discutée ici . Merci @CodaFi et @Sahil pour votre discussion dans les commentaires

17
KrishnaCA

Vous pouvez utiliser CFGetRetainCount function pour vérifier le nombre de réf.

var vc1 = UIViewController()
var vc2 = vc1
var vc3 = vc2
weak var vc4 = vc3


print(CFGetRetainCount(vc1)) //4
print(CFGetRetainCount(vc2)) //4 
print(CFGetRetainCount(vc3)) //4
print(CFGetRetainCount(vc4)) //4

vous pouvez également vous référer à ceci Get Ref Count

4
Sahil

À mon avis, vc1 à vc3 augmente le nombre de conservations et la propriété par default est strongjusqu’à ce que nous spécifions comme weak.

strong: Strong est généralement utilisé par une classe pour établir la propriété d'un objet. Cela augmente le nombre de conservations (quelque chose qu'ARC traite pour vous), il conserve essentiellement l'objet pointé en mémoire jusqu'à ce que l'instance de classe cesse de pointer dessus. C’est généralement ce que vous voulez, mais cela peut provoquer un phénomène appelé «cycle de conservation».

Dans le cas de vc4 en tant que weak:

faible: Ceci donne un pointeur sur un objet, mais ne revendique pas la propriété et n'augmente pas le nombre de retenues. En gros, il garde un pointeur valide sur un objet tant qu'une autre classe le pointe fortement. Si rien d’autre n’essaie de le conserver, le pointeur faible est automatiquement défini sur nil.

2
vaibhav

1,2,3,4 - le nombre de références sera 3

La seule exception lorsque le nombre de références ne sera pas incrémenté - 4ème ligne en raison d'un modificateur faible

1