Мой вопрос: почему слабый IBOutletCollection всегда равен нулю? Если изменения слабые и сильные, все мои кнопки есть, это просто странно. Я пытаюсь понять логику Apple, и я не вижу разницы между одной кнопкой и множеством кнопок с точки зрения управления памятью. Я что-то пропустил?
Слабый IBOutleCollection всегда равен нулю
Ответ 1
Не совсем полный, но простой ответ:
Единственный UIButton
, созданный с помощью IB, автоматически является подвидным для другого UIView (по крайней мере, для вашего представления UIViewController
) и сильно указывает на это.
An IBOutletCollection
- это NSArray
или NSMutableArray
, а не UIView
, отображаемый в любом месте, и UIViews, очевидно, не имеют свойства, указывающего на Outlet (Collection) s, которые указывают на них, поэтому ничто не указывает на IBOutletcollections. Вы должны сделать это сами.
Ответ 2
Из Apple Руководство по программированию ресурсов:
Каждый раз, когда вы запрашиваете класс NSBundle или NSNib для загрузки файла nib, базовый код создает новую копию объектов в этом файле и возвращает их вам. (Код nib-загрузки не перерабатывает файлы файлов nib из предыдущей попытки загрузки.) Вам нужно убедиться, что вы сохраняете новый граф объектов до тех пор, пока это необходимо, и отмените его, когда вы закончите с ним. Обычно вам нужны сильные ссылки на объекты верхнего уровня, чтобы гарантировать, что они не будут освобождены; вам не нужны сильные ссылки на объекты, расположенные ниже на графике, потому что они принадлежат их родителям, и вы должны свести к минимуму риск создания сильных эталонных циклов.
С практической точки зрения, в iOS и OS X выходы должны быть определены как объявленные свойства. Розетки, как правило, должны быть слабыми, за исключением тех, которые принадлежат файловому владельцу, для объектов верхнего уровня в файле nib (или в iOS, сценае раскадровки), который должен быть сильным. Поэтому создаваемые вами ролики должны быть слабыми, потому что:
Выходы, создаваемые для просмотра в представлении диспетчера представлений или в окне оконных контроллеров, например, являются произвольными ссылками между объектами, которые не подразумевают право собственности. Сильные розетки часто задаются классами классов (например, UIViewControllers view outlet или NSWindowControllers).
@property (weak) IBOutlet MyView *viewContainerSubview;
@property (strong) IBOutlet MyOtherClass *topLevelObject;
И далее по странице:
Розетки должны быть изменены на сильные, когда розетка должна считаться принадлежащей указанному объекту:
- Как указывалось ранее, это часто происходит с объектами верхнего уровня файлов Owner в файле nib, которые часто считаются владельцами файлов.
- В некоторых ситуациях вам может понадобиться объект из файла nib, который существует вне его исходного контейнера. Например, у вас может быть выход для представления, которое может быть временно удалено из его первоначальной иерархии представлений и поэтому должно поддерживаться независимо.