Почему торговые точки по умолчанию объявлены слабыми? - PullRequest
0 голосов
/ 13 марта 2020

Я посмотрел эту топи c в Google, но пока не получил понятного ответа, проблема в том, что я знаю, что когда два класса соединяются вместе, создавая экземпляр объекта в первом классе из второго класса и объявляя другой объект во втором классе из первого класса, это приведет к циклу сохранения, который должен быть прерван с помощью ключевого слова «слабый» или «неизвестный», но я не могу применить этот способ мышления к объявлениям IBOutlets как слабым, например

class SignUpViewController: UIViewController {
 override func viewDidLoad() {
        super.viewDidLoad()
    }
@IBOutlet weak var signUpBttn: UIButton!
}

это розетка в моем классе viewController, почему розетка объявлена ​​слабой? Насколько я понимаю, что для того, чтобы иметь цикл сохранения, класс uibutton должен иметь объект из класса viewController, чтобы два класса (viewController и uibutton) были соединены вместе, может кто-нибудь прояснить, что происходит под капотом?

Ответы [ 3 ]

1 голос
/ 13 марта 2020

все элементы пользовательского интерфейса в контроллере представления являются частью представления viewController. Таким образом, view является классом UIView, а выходы являются ссылкой в ​​viewController на элементы класса UIView, поэтому, если представление удалено из иерархии представления, все перекрестные элементы должны быть слабыми, чтобы избежать перекрестных ссылок. проблема с этим является ссылкой из apple MVC, где ViewController является контроллером, но имеет множество связанных кодов части представления. все ваши розетки должны быть помещены в класс UIView вашего ViewController.

0 голосов
/ 14 марта 2020

Apple рекомендует объявить @IBOutlet как strong . Об этом можно найти множество обсуждений / статей.

Если вы посмотрите это видео с Apple 2015 WWD C, около отметки 32:30: https://developer.apple.com/videos/play/wwdc2015/407/

Он заявляет:

В общем, вы должны сделать свою розетку сильной, особенно если вы подключаете розетку к вспомогательному представлению или к ограничению, которое не всегда будет сохраняться в иерархии представлений. Единственный раз, когда вам действительно нужно сделать вывод слабым, это если у вас есть собственное представление, которое ссылается на что-то, поддерживающее иерархию представления, и в общем случае это не рекомендуется.

0 голосов
/ 13 марта 2020

TLDR - на мой взгляд, это не очень хорошее решение.

A strong ссылка обозначает право собственности. Контроллер представления или представления является владельцем представлений, поэтому логический выбор должен быть strong.

Однако в большинстве случаев это не имеет большого значения, поскольку на представления также строго ссылаются их родители в представлении. иерархия.

Когда это имеет значение? Это имеет значение в ситуациях, когда вы динамически обновляете иерархию представлений, удаляя представления / ограничения и т. Д. c. Как только вы удалите представление / ограничение из иерархии, и у вас нет сильной ссылки на него, оно будет удалено из памяти.

Также обратите внимание, что комбинация weak и ! является немного опасно, потому что ! обозначает ссылку, которую, как вы ожидаете, никогда не будет nil.

Это может привести к ошибкам, например:

@IBOutlet weak var constraint: NSLayoutConstraint!

...

constraint.isActive = false // removes constraint from hierarchy, assigns `nil` to constraint
...
constraint.isActive = true // crashes the app

Лично я всегда делаю выводы strong. Для любых ссылок weak я всегда использую ?, а не !.

Обратите внимание, что weak в этом случае не имеет ничего общего с защитой от циклов ссылок. Это было только личное решение разработчиков Xcode.

Исторически, с UIViewController.viewDidUnload могла быть связь. Однако этот метод никогда не вызывается, так как iOS 6.

...