Подтвердить что ты не робот

Сильные и слабые ссылки в Swift

В Objective C вы можете определить свойство как имеющее сильную или слабую ссылку, например:

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

Как это делается быстро?

4b9b3361

Ответ 1

Прямо из руководства 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

Ответ 2

По умолчанию параметр var является сильным. Вы можете добавить слабое ключевое слово перед var, чтобы сделать его слабым.

Ответ 4

Просто хотел, чтобы вы знали, что var по умолчанию сильно, но добавив "слабый" перед ним, вы делаете его слабым. Если вы его пропустили

Ответ 5

Это более важный комментарий, но я не мог в него поместиться.

Если вы делаете

weak let name : SomeClass

Это приведет к следующей ошибке:

"слабый" должен быть изменяемой переменной, поскольку он может меняться во время выполнения

Вы должны сделать

weak var name : SomeClass

"слабая" переменная должна иметь необязательный тип "SomeClass?"

Итак, вы должны сделать:

weak var name : SomeClass?

Кроме того, в Swift все слабые ссылки являются непостоянными Опциями (думаю, var vs. let), потому что ссылка может и будет мутирована до нуля, когда больше нет ничего, содержащего сильную ссылку на нее. См. здесь

В результате этой обязательной необязательной процедуры вам всегда нужно развернуть ее, чтобы вы могли получить доступ к ее фактическому значению.

Ответ 6

Подробнее

xCode 9.1, Swift 4

Дополнительная информация об использовании ARC

Полный образец

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")

Результат

введите описание изображения здесь