Я программировал в Swift
пару месяцев. В последнее время я больше сосредоточился на концепциях того, как Swift
работает как язык.
Следовательно, недавно, читая документацию Apple по автоматической подсчету ссылок (ARC), я наткнулся на следующие строки:
Этот наверху:
В большинстве случаев это означает, что управление памятью "просто работает" в Swift, и вам не нужно думать об управлении памятью самостоятельно. ARC автоматически освобождает память, используемую экземплярами класса, когда эти экземпляры больше не нужны.
И в следующем абзаце следующее:
Чтобы сделать это возможным, всякий раз, когда вы присваиваете экземпляр класса свойству, константе или переменной, это свойство, константа или переменная делает сильную ссылку на экземпляр. Ссылка называется "сильной" ссылкой, потому что она держится на этом экземпляре и не позволяет ее освобождать до тех пор, пока эта сильная ссылка остается.
Я немного смущен, что такое динамика ситуации. Я заметил при использовании раскадровки, что вы установили ссылку на слабый, следовательно, класс выглядит так, и то, что я бы назвал case 1:
Случай 1
class SomeClass : UIViewController {
@IBOutlet weak var nameLabel : UILabel!
override func viewDidLoad() {
nameLabel.text = "something."
}
}
Здесь метка имеет один-к-одному слабую ссылку с ViewController, и как только контроллер изменен, ссылка сломана (память dealloc), так как она слаба. Следовательно, нет проблем, связанных с памятью.
Извините меня, если вышеуказанное утверждение неверно или свободно удерживается. Я был бы рад, если кто-то подтвердит мое предположение или примет его.
Мой вопрос касается второго случая, однако, когда я не использую раскадровки и класс выглядит следующим образом:
Случай 2
class SomeClass : UIViewController {
var nameLabel : UILabel = {
let label = UILabel()
label.translatesAutoresizingMaskIntoConstraints = false
return label
}()
override func viewDidLoad() {
view.addSubView(nameLabel)
// view.addConstraints...
}
}
В приведенном выше случае Мое предположение состоит в том, что ViewController имеет одну-на-одну сильную ссылку с меткой, а вид внутри ViewController также имеет сильную ссылку на метку. Если класс изменен/метка удалена из subview.. тогда я думаю, что память не будет освобождена. Или, по крайней мере, контроллер просмотра будет поддерживать сильную ссылку на метку (согласно документам.)
Я подтвердил это, удалив ярлык из представлений представления и распечатав ярлык (он дал мне экземпляр UILabel с фреймом, который был в 0 и 0 размерах.), следовательно, экземпляр, который не равен нулю.
Единственное, что я мог извлечь из этого, было то, что, хотя метка была удалена из UIView, она по-прежнему поддерживала сильную ссылку на контроллер, следовательно, постоянное состояние в памяти. Я прав?
Если это так. Как я должен помешать моему коду иметь такие проблемы с памятью? Большая проблема заключается в том, что, если я объявляю свою переменную так, я получаю нуль, добавляя ее как подчиненный основной вид в контроллере.
weak var nameLabel : UILabel = {
let label = UILabel()
label.translatesAutoresizingMaskIntoConstraints = false
return label
}()
Если объявление переменных, подобных во втором случае, может привести к постоянным сильным ссылкам, как я должен объявить их вместо того, чтобы не иметь проблем с памятью?
Итак, мой вопрос:
В случаях, когда не используются выходы раскадровки, а переменные сильно привязаны к контроллеру представления, будут ли эти ссылки вызывать проблемы с памятью?
Если да, то какой code declaration practice
должен я следовать?
Если это не так, предоставьте вдумчивые аргументы с действительными объяснениями, чтобы противостоять им.
Опять же, простите меня, если я где-то ошибаюсь.
Спасибо заранее.