Я немного запутался в отношении управления памятью Swift.Я понимаю, что removeFromSuperview
освобождает представление и делает его пригодным для сбора мусора, если retainCount
равно 0. Однако после отслеживания CFGetRetainCount(myView)
я не уверен, как вычисляется retainCount
и как правильно убедиться, что представлениебудет полностью освобожден после вызова removeFromSuperview.
Это то, что я получаю для простой UILabel.Код:
let myLabel = UILabel()
print("After creation")
print(CFGetRetainCount(myLabel))
myLabel.frame = CGRect(x: 0, y: 0, width: view.frame.width - 40, height: 60)
print("After frame set")
print(CFGetRetainCount(myLabel))
myLabel.text = "Lorem ipsum"
myMainView.addSubview(myLabel)
print("After added to superview")
print(CFGetRetainCount(myLabel))
let otherLabel = UILabel()
otherLabel.frame = CGRect(x: 0, y: myLabel.frame.maxY + 20, width: view.frame.width - 100, height: 60)
print("After referenced to position other view")
print(CFGetRetainCount(myLabel))
myLabel.removeFromSuperview()
print("After removed from superview")
print(CFGetRetainCount(myLabel))
Консоль:
After creation
3
After frame set
3
After added to superview
4
After referenced to position other view
4
After removed from superview
3
Это приводит меня к нескольким вопросам:
1) Я понимаю, что CFGetRetainCount содержит слабые ссылки, но как это происходит после 3Я только что создал UILabel?
2) Я добавляю представления внутри функции без ссылки на класс, когда они мне не нужны позже (я тоже могу добавить gestRecognizer) и удаляю их перед удалением содержащихсмотреть с:
myMainView.subviews.forEach({
$0.removeFromSuperview()
})
Это считается хорошей практикой?Препятствия жеста-распознавателя предотвращают освобождение памяти?
3) Как убедиться, что память освобождается, когда счетчик уже равен 3, когда я создаю представление?
Чего мне не хватает?