Обе ссылки weak
и unowned
не создают strong
удержания для указанного объекта (также известные как они не увеличивают счетчик удержания, чтобы не дать ARC освободить указанный объект).
Но почему два ключевых слова? Это различие связано с тем, что Optional
типов встроены в язык Swift. Вкратце о них: необязательные типы обеспечивают безопасность памяти (это прекрасно работает с Конструктор Swift правила, которые являются строгими, чтобы обеспечить это преимущество).
Ссылка weak
допускает возможность его преобразования в nil
(это происходит автоматически, когда объект, на который указывает ссылка, освобождается), поэтому тип вашего свойства должен быть необязательным - поэтому вы, как программист, обязаны проверить его перед использованием ( в основном компилятор заставляет вас, насколько это возможно, писать безопасный код).
Ссылка unowned
предполагает, что она никогда не станет nil
за время своего существования. Необязательная ссылка должна быть установлена во время инициализации - это означает, что ссылка будет определена как необязательный тип, который можно безопасно использовать без проверок. Если каким-то образом объект, на который имеется ссылка, будет освобожден, приложение выйдет из строя при использовании не принадлежащей ему ссылки.
Из документов Apple:
Используйте слабую ссылку всякий раз, когда она действительна для того, чтобы эта ссылка стала нулевой в какой-то момент в течение ее жизненного цикла. И наоборот, используйте незарегистрированную ссылку, если вы знаете, что ссылка никогда не будет нулевой, если она была установлена во время инициализации.
В документации есть несколько примеров, в которых обсуждаются циклы сохранения и способы их разрыва. Все эти примеры взяты из документов.
Пример ключевого слова weak
:
class Person {
let name: String
init(name: String) { self.name = name }
var apartment: Apartment?
}
class Apartment {
let number: Int
init(number: Int) { self.number = number }
weak var tenant: Person?
}
А теперь для некоторого искусства ASCII (вам следует пойти смотрите документацию - там красивые схемы):
Person ===(strong)==> Apartment
Person <==(weak)===== Apartment
В примерах Person
и Apartment
показана ситуация, когда два свойства, оба из которых могут быть равны нулю, потенциально могут вызвать цикл сильных ссылок. Этот сценарий лучше всего разрешить с помощью слабой ссылки. Оба объекта могут существовать без строгой зависимости друг от друга.
Пример ключевого слова unowned
:
class Customer {
let name: String
var card: CreditCard?
init(name: String) { self.name = name }
}
class CreditCard {
let number: UInt64
unowned let customer: Customer
init(number: UInt64, customer: Customer) { self.number = number; self.customer = customer }
}
В этом примере Customer
может иметь или не иметь CreditCard
, но CreditCard
всегда будет связан с Customer
. Чтобы представить это, класс Customer
имеет необязательное свойство card
, но класс CreditCard
имеет необязательное (и не имеющее владельца) свойство customer
.
Customer ===(strong)==> CreditCard
Customer <==(unowned)== CreditCard
Примеры Customer
и CreditCard
показывают ситуацию, когда одно свойство, которому разрешено быть нулевым, а другое свойство, которое не может быть нулевым, может вызвать цикл сильных ссылок. Этот сценарий лучше всего разрешить с помощью неизвестной ссылки.
Примечание от Apple:
Слабые ссылки должны быть объявлены как переменные, чтобы указать, что их значение может измениться во время выполнения. Слабая ссылка не может быть объявлена константой.
Существует также третий сценарий, когда оба свойства всегда должны иметь значение, и ни одно свойство никогда не должно быть нулевым после завершения инициализации.
И есть также классические сценарии цикла сохранения, которых следует избегать при работе с замыканиями.
Для этого я рекомендую вам посетить документы Apple или прочитайте книгу .
person
Ilea Cristian
schedule
24.09.2014
unowned
для контролируемых нами классов, для классов Apple используюweak
, потому что мы не можем точно гарантировать, что он делает. - person onmyway133   schedule 20.10.2015