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:
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.
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
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
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
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
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
À mon avis, vc1 à vc3 augmente le nombre de conservations et la propriété par default est strong
jusqu’à 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.
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