Примеры сильных ссылочных циклов, которые я обычно вижу, включают два класса со свойствами, указывающими друг на друга. Однако, что если только один из классов имеет свойство, указывающее на другой, например, как это:Является ли это сильным эталонным циклом или утечкой памяти вообще?
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', поэтому оба они освобождаются. – ozgur
Чтобы расширить это, нет цикла, так как ваш график имеет только один край: 'myClassA.classB -> myClassB'. – jtbandes
Если этот код вызвал ссылку, это сделало бы ARC только незначительно полезным. Все ссылки, хранящиеся на уровне экземпляра, освобождаются при выпуске экземпляра. – Avi