IBOutlets сильные или слабые-действительно ли это имеет значение для управления памятью? (ДУГА)


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

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

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

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

Спасибо за любые идеи !

2 5

2 ответа:

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

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

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

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

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

Еще