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
- Kaan Dedeoglu respuesta
- ARC y administración de memoria en Swift
- "DÉBIL, FUERTE, DESCONOCIDO, ¡OH MI!" - UNA GUÍA DE REFERENCIAS EN SWIFT
- Tutorial de ARC Swift
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.
Las propiedades son fuertes por defecto, pero si quiere una propiedad débil, puede:
weak var tenant: Person?
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.