В Objective C вы можете определить свойство как имеющее сильную или слабую ссылку, например:
@property(strong)...
@property(weak)...
Как это делается быстро?
В Objective C вы можете определить свойство как имеющее сильную или слабую ссылку, например:
@property(strong)...
@property(weak)...
Как это делается быстро?
Прямо из руководства 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") }
}
По умолчанию свойства . Но посмотрите на собственность арендатора класса "Квартира", он объявлен слабым. Вы также можете использовать ключевое слово unowned, которое переводит на unsafe_unretained из Objective-C
https://itunes.apple.com/tr/book/swift-programming-language/id881256329?mt=11
По умолчанию параметр var является сильным. Вы можете добавить слабое ключевое слово перед var, чтобы сделать его слабым.
Свойства по умолчанию сильны, но если вы хотите получить слабую собственность, вы можете:
weak var tenant: Person?
Просто хотел, чтобы вы знали, что var по умолчанию сильно, но добавив "слабый" перед ним, вы делаете его слабым. Если вы его пропустили
Это более важный комментарий, но я не мог в него поместиться.
Если вы делаете
weak let name : SomeClass
Это приведет к следующей ошибке:
"слабый" должен быть изменяемой переменной, поскольку он может меняться во время выполнения
Вы должны сделать
weak var name : SomeClass
"слабая" переменная должна иметь необязательный тип "SomeClass?"
Итак, вы должны сделать:
weak var name : SomeClass?
Кроме того, в Swift все слабые ссылки являются непостоянными Опциями (думаю, var vs. let), потому что ссылка может и будет мутирована до нуля, когда больше нет ничего, содержащего сильную ссылку на нее. См. здесь
В результате этой обязательной необязательной процедуры вам всегда нужно развернуть ее, чтобы вы могли получить доступ к ее фактическому значению.
xCode 9.1, Swift 4
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")