2014-02-17 2 views
5

Я недавно много читал здесь и на других сайтах о том, должны ли IBOutlets быть сильными или слабыми. Официальный вердикт заключается в том, что они должны быть слабыми, за исключением случаев, когда они ссылаются на объекты xib верхнего уровня.IBOutlets Сильный или слабый - действительно ли это имеет значение для управления памятью? (ARC)

Это прекрасно.

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

Я правильно понимаю, что для контроллеров представлений больше нет в стеке навигации (т.е. после того, как они были загружены, а затем вытолкнуты), что тогда будут объявлены какие-либо IBOutlets, объявленные как слабые?

Спасибо за понимание!

+2

в общем, вы держите РОЗЕТКИ 'weak', если они имеют статический' superview' уже (что сохраняет вид живых до тех пор, пока они являются частью вида и иерархии это не приведет к сильному сохранить цикл), и если какое-либо представление добавляется/удаляется из любого 'view', то ссылка' strong' лучше, чтобы убедиться, что представление сохранено до тех пор, пока вы не захотите его окончательно отпустить. – holex

ответ

1

IBOutlets может быть объявлен слабым, потому что они будут созданы во время синтаксического анализа XIB и добавлены в стек UIView ... так что вам не нужна сильная ссылка на объект.

Когда вы объявляете слабый IBOutlet, вы гарантируете, что при исчезновении основного UIView UIViewcontroller все подъязыки будут удалены без какой-либо утечки памяти.

+0

Это то, что меня интересует, поэтому, чтобы они были слабыми, можно было бы удалить субвью, как только собственная точка зрения уже не будет вокруг? – GuybrushThreepwood

+0

Да, потому что единственная (сильная) ссылка в коде - это его супервизор. – IgnazioC

2

Возможно, вы заметили, что при вставке IBOutlet непосредственно из Interface Builder вы можете выбрать, использовать ли это как слабое или сильное свойство. После небольшого поиска в библиотеке разработчика Apple я нашел, когда вы должны использовать один или другой:

Розетки, как правило, должны быть слабыми, за исключением файлов от владельца файла до объектов верхнего уровня в файле nib (или в iOS, сцена для раскадровки), которая должна быть сильной. Таким образом, создаваемые выходы должны быть слабыми, потому что:

Выходы, которые вы создаете для просмотра в представлении диспетчера вида или в окне окна контроллера, например, являются произвольными ссылками между объектами, которые не подразумевают право собственности. Сильные розетки часто задаются классами каркаса (например, в окне просмотра UIViewController или в окне выхода NSWindowController).

more

Смежные вопросы