Слабый IBOutleCollection всегда равен нулю

Мой вопрос: почему слабый IBOutletCollection всегда равен нулю? Если изменения слабые и сильные, все мои кнопки есть, это просто странно. Я пытаюсь понять логику Apple, и я не вижу разницы между одной кнопкой и множеством кнопок с точки зрения управления памятью. Я что-то пропустил?

Ответ 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, который существует вне его исходного контейнера. Например, у вас может быть выход для представления, которое может быть временно удалено из его первоначальной иерархии представлений и поэтому должно поддерживаться независимо.