IBOutlet
должен быть сильным по причине производительности. См. Справочник раскадровки, Сильный IBOutlet, Док сцены в iOS 9
Как объяснено в этом параграфе, выходы для подпредставлений представления контроллера представления могут быть слабыми, потому что эти подпредставления уже принадлежат объекту верхнего уровня файла пера. Однако, когда Outlet определяется как слабый указатель и указатель установлен, ARC вызывает функцию времени выполнения:
id objc_storeWeak(id *object, id value);
Это добавляет указатель (объект) к таблице, используя значение объекта в качестве ключа. Эта таблица называется слабой таблицей. ARC использует эту таблицу для хранения всех слабых указателей вашего приложения. Теперь, когда значение объекта освобождено, ARC будет перебирать слабую таблицу и устанавливать для слабой ссылки значение nil. В качестве альтернативы, ARC может позвонить:
void objc_destroyWeak(id * object)
Затем объект незарегистрирован и objc_destroyWeak вызывает снова:
objc_storeWeak(id *object, nil)
Этот бухгалтерский учет, связанный со слабой ссылкой, может занять в 2-3 раза дольше, чем выпуск сильной ссылки. Таким образом, слабая ссылка приводит к накладным расходам на время выполнения, которых вы можете избежать, просто определяя выходы как сильные.
Начиная с Xcode 7, он предлагает strong
Если вы посмотрите сеанс WWDC 2015 407 « Реализация дизайнов пользовательского интерфейса в Интерфейсном Разработчике» , он предлагает (стенограмма с http://asciiwwdc.com/2015/sessions/407 )
И последний вариант, на который я хочу обратить внимание, - это тип хранилища, которое может быть сильным или слабым.
В общем случае вы должны сделать свою точку продаж сильной, особенно если вы подключаете точку выхода к дополнительному представлению или к ограничению, которое не всегда будет сохраняться иерархией представления.
Единственный раз, когда вам действительно нужно сделать вывод слабым, это если у вас есть пользовательское представление, которое ссылается на что-то, поддерживающее иерархию представления, и в целом это не рекомендуется.
Так что я собираюсь выбрать сильный, и я нажму на кнопку «Подключиться», что сгенерирует мой выход.
IBOutletCollection()
не должно бытьweak
, в противном случае он возвращается какnil
.