variable unowned strong collector arc objective-c reference weak-references swift

objective c - unowned - Referencias fuertes y débiles en Swift



weak self swift (6)

En Objective C, puede definir una propiedad como si tuviera una referencia fuerte o débil como esta:

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

¿Cómo se hace esto rápido?


Detalles

xCode 9.1, Swift 4

Más información sobre el uso de ARC

Muestra completa

import UIKit var str = "Hello, playground" class BasicClass: CustomStringConvertible { let text: String init(text: String) { self.text = text } deinit { print ("Object of the /"/(className)/" class deinited") } var className: String { return "/(type(of: self))" } var referenceCount: Int { return CFGetRetainCount(self) } var description: String { return "className: /(className), reference count: /(referenceCount)" } } class Class1: BasicClass { var objectWithStrongReference: Class2? override var description: String { return super.description + ", embed strong obj reference count: /(objectWithStrongReference?.referenceCount ?? 0)" } } class Class2: BasicClass { weak var objectWithWeakReference: Class1? override var description: String { return super.description + ", embed weak obj reference count: /(objectWithWeakReference?.referenceCount ?? 0)" } } var obj1: Class1? = Class1(text: "String 1") print(obj1 ?? "nil") var obj2: Class2? = Class2(text: "String 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")

Resultado


Directamente de la guía de Swift Language :

class Person { let name: String init(name: String) { 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") } }

las propiedades son fuertes por defecto. Pero mira la propiedad del inquilino de la clase "Apartamento", se declara como débil. También puede usar la palabra clave sin propietario, que se traduce como unsafe_unretained de Objective-C

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


Este es más un comentario importante, pero no pude encajarlo.

Si lo haces

weak let name : SomeClass

Dará el siguiente error:

''débil'' debe ser una variable mutable, porque puede cambiar en tiempo de ejecución

Debes hacer

weak var name : SomeClass

La variable ''débil'' debería tener el tipo opcional ''SomeClass?''

Entonces debes hacer:

weak var name : SomeClass?

Además, en Swift, todas las referencias débiles son Opcionales no constantes (piense var vs. let) porque la referencia puede y será mutada a nil cuando ya no hay nada que tenga una referencia fuerte a ella. Mira here

Como resultado de esta opcionalización obligatoria, siempre debe desenvolverlo para que pueda acceder a su valor real.



Solo quería que supiera que una var es fuerte por defecto, pero al agregar "débil" delante de ella la debilita. En caso que te lo hayas perdido


Una var es fuerte por defecto. Puede agregar la palabra clave débil antes de una var para debilitarla.