Alloc-init объект в UIStoryboard

Рассмотрим ситуацию, когда у вас есть объект в файле раскадровки, связанный с IBOutlet , например, следующий.

 @property (nonatomic, strong) IBOutlet UIImageView *imageView; 

Оставленный на собственные устройства, ViewController будет с удовольствием загружать и отображать правильное изображение внутри правильного фрейма и т. Д., Как это определено в Interface Builder. Однако, если следующий код добавлен к методу viewDidLoad View Controller, достигается (по-видимому) идентичный результат.

 - (void)viewDidLoad { _imageView = [[UIImageView alloc] init]; //... } 

Означает ли это, что программная инициализация пакетов IBOutlets полностью необязательна? Или добавление этой линии к достижению немного другого результата?

Я спрашиваю, потому что я всегда добавлял alloc-init в реализацию, а затем в своем последнем проекте я забыл об этом, и, к моему удивлению, он все еще работал точно так, как предполагалось.

Файл раскадровки или xib – это сериализация объектов, содержащихся внутри. Когда загружается раскадровка, все объекты создаются (используя initWithCoder: поскольку мы их десериализируем). Это делает ту же работу, что и allo / init, с добавлением установки всех свойств объекта, которые определены в xib.

Xib содержит достаточно информации о вашем представлении изображения, чтобы полностью его создать. Если вы затем выделите / запустите новое представление изображения и назначьте его переменной, которая была использована для розетки, вы просто замените объект, который был создан из раскадровки, что довольно бессмысленно, так как ваша розетка теперь ничего не указывает на экран.

В заключение – alloc / init, каждая розетка не является необязательной , это неправильно .

Когда вы добавляете объект в NIB, жизненный цикл объекта полностью контролируется UIViewController (или подклассом) и ссылкой ARC, он по умолчанию слаб, поскольку ViewController будет обрабатывать выделение, инициализировать и освобождать объект должным образом при загрузке view, поэтому то, что вы там делаете, меняет ссылку ARC на сильную, поэтому объект не сразу освобождается после вашей ссылки, он будет работать, как вы пробовали, но теоретически вы закончите с объектом, созданным в Interface Builder и тот, который вы только что создали там, если вы не установили какой-либо фрейм или не добавили в какое-либо представление, и вы не сделаете никаких ссылок на объект, который ARC выпустит, и вы закончите созданный вами образ Inteface Builder, но без указателя на него, поскольку вы ссылаетесь на _imageView на новый [[UIImageView alloc] init], который вы только что создали.

Если вы используете Xcode 4.4, он автоматически синтезирует свойства для вас. Возможно, это вы переживаете? ссылка

Alloc / init объекта в раскадровке – это в основном ошибка.

Когда представление загружено, все подпункты будут инициализированы и загружены автоматически. Если вы снова инициализируете его, будет создан другой экземпляр, и предыдущий экземпляр объекта не будет использоваться.

На самом деле, чтобы сделать экземпляр недавно инициализированного объекта работоспособным, вы должны добавить экземпляр (в вашем случае экземпляр UIImageView) в качестве subview.