Des références fortes et faibles dans Swift

En Objective C, vous pouvez définir une propriété comme ayant une référence forte ou faible comme suit:

@property(strong)... @property(weak)... 

Comment cela se fait-il rapidement?

Directement du guide Swift Language :

 class Person { let name: Ssortingng init(name: Ssortingng) { self.name = name } var apartment: Apartment? deinit { println("\(name) is being deinitialized") } } class Apartment { let number: Int init(number: Int) { self.number = number } weak var tenant: Person? deinit { println("Apartment #\(number) is being deinitialized") } } 

les propriétés sont fortes par défaut. Mais regardez la propriété du locataire de la classe “Appartement”, elle est déclarée faible. Vous pouvez également utiliser le mot-clé sans propriétaire, qui se traduit par unsafe_unretained à partir d’Objective-C

https://itunes.apple.com/tr/book/swift-programming-language/id881256329?mt=11

Un var est fort par défaut. Vous pouvez append le mot-clé faible avant un var pour le rendre faible.

Les propriétés sont fortes par défaut, mais si vous voulez une propriété faible, vous pouvez:

  weak var tenant: Person? 

Source: https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/AutomaticReferenceCounting.html

Je voulais juste que vous sachiez qu’un var est fort par défaut mais en ajoutant “faiblesse” devant, vous le rendez faible. Dans le cas où vous l’avez manqué

C’est plus un commentaire important, mais je ne pouvais pas l’intégrer.

Si tu fais

 weak let name : SomeClass 

Cela donnera l’erreur suivante:

“faible” doit être une variable mutable, car elle peut changer à l’exécution

Tu dois faire

 weak var name : SomeClass 

La variable “faible” doit avoir le type facultatif “SomeClass?”

Donc, vous devez faire:

 weak var name : SomeClass? 

De plus, dans Swift, toutes les références faibles sont des options optionnelles non constantes (pensez à var vs let) car la référence peut être et sera mutée à néant lorsqu’il n’y a plus rien qui y fasse référence. Voir ici

En raison de cette option-option obligatoire, vous devez toujours la déballer pour pouvoir accéder à sa valeur réelle.

Détails

xCode 9.1, Swift 4

Plus d’infos sur l’utilisation de l’ARC

  • Kaan Dedeoglu répond
  • ARC et gestion de la mémoire à Swift
  • “FAIBLES, FORTS, INATTENDUS, OH MON!” – UN GUIDE DE RÉFÉRENCES DANS SWIFT
  • Tutoriel ARC rapide

Échantillon complet

 import UIKit var str = "Hello, playground" class BasicClass: CustomSsortingngConvertible { let text: Ssortingng init(text: Ssortingng) { self.text = text } deinit { print ("Object of the \"\(className)\" class deinited") } var className: Ssortingng { return "\(type(of: self))" } var referenceCount: Int { return CFGetRetainCount(self) } var description: Ssortingng { return "className: \(className), reference count: \(referenceCount)" } } class Class1: BasicClass { var objectWithStrongReference: Class2? override var description: Ssortingng { return super.description + ", embed strong obj reference count: \(objectWithStrongReference?.referenceCount ?? 0)" } } class Class2: BasicClass { weak var objectWithWeakReference: Class1? override var description: Ssortingng { return super.description + ", embed weak obj reference count: \(objectWithWeakReference?.referenceCount ?? 0)" } } var obj1: Class1? = Class1(text: "Ssortingng 1") print(obj1 ?? "nil") var obj2: Class2? = Class2(text: "Ssortingng 2") print(obj2 ?? "nil") print("=====================================") print("obj1.value = obj2, obj2.value = obj1") obj1?.objectWithStrongReference = obj2 obj2?.objectWithWeakReference = obj1 print(obj1 ?? "nil") print(obj2 ?? "nil") print("=====================================") print("obj2 = nil") obj2 = nil print(obj1 ?? "nil") print(obj2 ?? "nil") print("=====================================") print("obj1 = nil") obj1 = nil print(obj1 ?? "nil") print(obj2 ?? "nil") 

Résultat

entrer la description de l'image ici