Новое поведение для создания IBOutlet в Xcode 6
Я помню, что в Xcode 5, если бы вы перетаскивали представление из раскадровки в код, было бы создано свойство с weak
приписывать. Теперь в Xcode 6 он использует unsafe_unretained
по умолчанию. Что может быть причиной этого изменения?
3 ответа
Как сказано в Википедии:
Обнуление слабых ссылок доступно только в Mac OS X 10.7 "Lion" или более поздней версии и iOS 5 или более поздней версии, поскольку они требуют дополнительной поддержки во время выполнения Objective-C. Код, который использует ARC, но должен поддерживать версии ОС, более старые, чем Mac OS X, Lion или iOS 5.0 не могут использовать обнуление слабых ссылок, и поэтому должны использовать unsafe_unretained слабые ссылки
Ваша цель развертывания проекта iOS должна быть чем-то до iOS 5 (вероятно, iOS 4.0) . Таким образом, Xcode создает unsafe_unretained вместо недели, поскольку ваше приложение должно работать на iOS 4 или более ранней версии iOS.
weak
свойства похожи unsafe_unretained
Просто они работают немного умнее. Когда объект, назначенный для свойства, освобождается, weak
ссылка автоматически становится nil
чтобы избежать сбоев при отправке сообщений этому объекту (его адрес памяти). Unsafe_unretained
свойства не делают этого. Они всегда будут держаться за адрес памяти (если вы не измените его вручную), независимо от объекта, связанного с этим адресом. Слабые ссылки могут предотвратить сбои в таком случае, но результат все равно будет не таким, как ожидалось. Если ваш код хорошо написан и организован, этого не должно быть.
И не удивительно, если яблоко устанавливает свойства выхода на unsafe_unretained
,
Сильная ссылка (которую вы будете использовать в большинстве случаев) означает, что вы хотите "владеть" объектом, на который вы ссылаетесь, с помощью этого свойства / переменной. Компилятор позаботится о том, чтобы любой объект, который вы назначаете этому свойству, не был уничтожен до тех пор, пока вы (или любой другой объект) будут указывать на него со строгой ссылкой. Только после того, как вы установите для свойства значение nil, объект будет уничтожен (если только один или несколько других объектов также не содержат строгой ссылки на него).
Напротив, со слабой ссылкой вы означаете, что не хотите контролировать время жизни объекта. Объект, на который вы слабо ссылаетесь, живет только потому, что по крайней мере еще один объект содержит сильную ссылку на него. Если это уже не так, объект уничтожается, и ваше слабое свойство автоматически устанавливается равным нулю. Наиболее частые случаи использования слабых ссылок в iOS:
- свойства делегата, на которые часто ссылаются слабо, чтобы избежать сохранения циклов, и
- подпредставления / элементы управления основного представления контроллера представления, потому что эти представления уже прочно удерживаются основным представлением.
unsafe_retained - это то же самое, что и слабый, тогда как сохраненный - такой же, как и сильный