Примеры циклов с сильными ссылками, которые я обычно вижу, включают два класса со свойствами, указывающими друг на друга. Однако что, если только один из классов имеет свойство, указывающее на другой экземпляр, например:
class ClassA {
var classB: ClassB? = nil
}
class ClassB {
}
Затем я создаю свои экземпляры следующим образом:
var myClassA = ClassA()
var myClassB = ClassB() //Reference count 1
myClassA.classB = myClassB //Reference count 2
// Now deallocate
myClassB = nil //Reference count 1
myClassA = nil
Поскольку я освободил myClassB
, счетчик ссылок равен 1. Что случилось со счетчиком ссылок myClassA.classB
? Он никогда не достигал нуля, так как я никогда не делал myClassA.classB = nil
и не использовал deinit
для этого. Это делается неявно, так как я сделал myClassA = nil
?
Это то, что можно отнести к категории сильных эталонных циклов? Я бы предположил, что это как минимум утечка памяти, правда ли это?
myClassA
наnil
, ARC автоматически прекращает владениеClassB
, поэтому они оба освобождаются. - person ozgur   schedule 22.05.2016myClassA.classB -> myClassB
. - person jtbandes   schedule 22.05.2016deinit
к обоим классам, которые что-то печатают, вы можете эмпирически убедиться, что экземплярClassA
и экземплярClassB
освобождаются. Кроме того, вероятно, нет нужды говорить, чтоmyClassA
иmyClassB
должны быть определены как необязательные, чтобы установить их вnil
. - person Rob   schedule 22.05.2016myClassA.classB
на ноль вdeinit
ClassA. - person TruMan1   schedule 22.05.2016