Я работаю над новым приложением без раскадровки. Все прошло нормально, пока я не протестировал свое приложение с помощью инструментов: оно просачивалось каждый раз, когда я назначал строку метке. Когда я работал с раскадровкой, у меня не было таких утечек.
Я прочитал следующие ресурсы, чтобы найти ответ:
Самое популярное мнение - это ошибка в Инструментах, но она кажется мне слишком очевидной.
Утечка воспроизводится в пустом приложении. В контроллере корневого представления:
class ViewController: UIViewController {
var label: UILabel?
override func viewDidLoad() {
super.viewDidLoad()
label = UILabel()
view.addSubview(label!)
var textForLabel: String? = "Hello"
label?.text = textForLabel
//attempt to free the memory
textForLabel = nil
label = nil
//EDIT: added after @J.Doe and @Sh-Khan answers, but it's still leaking
label.removeFromSuperview()
}
}
При тестировании этого приложения в Instruments на реальном устройстве (iPhone SE 11.2) я вижу следующее:
Когда я нажимаю _NSContiguousString, я вижу, что утечка памяти появляется в [UILabel setText:].
Я попытался установить метку как слабую, но затем она становится нулевой, когда я пытаюсь добавить ее в качестве подпредставления.
Итак, мои вопросы:
- как я могу устранить эту утечку памяти сейчас и в будущем?
- по этой причине мне следует создавать элементы пользовательского интерфейса только в файлах .xib / .storyboard?
Я новичок в разработке под iOS, поэтому я думаю, что мне не хватает чего-то очевидного. Я буду очень признателен за любую помощь или совет.
РЕДАКТИРОВАТЬ: Согласно @ Sh-Khan и @J.Doe ответам (спасибо вам, ребята!), Я добавил label.removeFromSuperview()
, но все еще есть утечка .
EDIT2: С помощью @ J.Doe я узнал, что UILabel освобождается из памяти, вызывая removeFromSuperview
и устанавливая его равным nil впоследствии. Утечка памяти в Инструментах осталась, но я отмечаю, что его ответ принят, потому что это то, что я хотел знать.
PS: После прочтения о NSString retain count Я думаю, что причиной утечки памяти может быть тот факт, что я использую строковый литерал, который не может быть освобожден, согласно обсуждению.