Ответ 1
Здесь vc1
, vc2
, vc3
относятся к одному и тому же объекту. Итак, подсчет ссылок этого объекта равен 3. Когда vc4
ссылаются на один и тот же объект, так как он является слабым эталоном, счетчик ссылок не будет увеличиваться на 1. Таким образом, счетчик ссылок после этого также будет 3
-
Счетчик ссылок
UIViewController
, который создается и передаетсяvc1
после первой строки кода: 1.var vc1:UIViewController? = UIViewController() // strong reference
-
После
vc2
относится к тому же объекту, что иvc1
. Счетчик ссылок на объект превращается в 2var vc2:UIViewController? = vc1 // strong reference
-
После
vc3
относится к тому же объекту, что иvc1
иvc2
. Счетчик ссылок на объект превращается в 3var vc3:UIViewController? = vc2 // strong reference
-
После
vc4
относится к тому же объекту, что иvc1
,vc2
иvc3
. Посколькуvc4
является слабым эталоном, счетчик ссылок не будет увеличиваться. Это значит, что счет еще 3.weak var vc4:UIViewController? = vc3 // weak reference
Что это значит:
Выполните следующий код.
vc1 = nil; // reference count = 3-1 = 2
vc2 = nil; // reference count = 2-1 = 1
vc3 = nil; // reference count = 1-1 = 0 and object is destroyed
Теперь напечатайте значение vc4
. Это будет nil
. Это происходит потому, что счетчик ссылок объекта обращается в нуль, и все переменные относятся к одному и тому же объекту.
Edit:
Использование CFGetRetainCount
в приведенном ниже коде дает следующие результаты, как указано здесь:
var vc1:NSDate? = NSDate()
print(CFGetRetainCount(vc1)) // 2 - I expected this to be 1 as only one variable is strongly referring this object.
var vc2:NSDate? = vc1
print(CFGetRetainCount(vc1)) // 3 - reference count incremented by 1 (strong reference)
var vc3:NSDate? = vc2
print(CFGetRetainCount(vc3)) // 4 - reference count incremented by 1 (strong reference)
weak var vc4:NSDate? = vc1
print(CFGetRetainCount(vc1)) // 4 - reference count not incremented (weak reference)
vc1 = nil
print(CFGetRetainCount(vc2)) // 3 - reference count decremented by 1 (strong reference removed)
vc2 = nil
print(CFGetRetainCount(vc3)) // 2 - reference count decremented by 1 (strong reference removed)
vc3 = nil
print(vc4) // nil - reference count should be decremented by 1 (last strong reference removed)
// Also due to the final line vc3 = nil, reference count should become zero
// However, we can't use `CFGetRetainCount` to get reference count in this case
// This is due to the final strong reference being removed and object getting destroyed
Причина, по которой CFRetainCount
дает 2 в 1-й строке, обсуждалась здесь . Спасибо @CodaFi и @Sahil за ваше обсуждение в комментариях