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?
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.
xCode 9.1, Swift 4
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")