Подтвердить что ты не робот

Должен ли я использовать awakeFromNib или initWithCoder здесь?

Мой контроллер начального представления загружен, и мне нужно, чтобы NSArray был init'd, должен ли я позаботиться об этом в методе awakeFromNib или методе initWithCoder:? awakeFromNib, похоже, работает лучше, так как мне не нужно ничего возвращать, но он работает, поскольку файлы nib - это то, что раньше использовалось правильно? Я не хочу использовать метод, который скоро будет разорван.

И будет initWithCoder: просто выглядеть:

- (id)initWithCoder:(NSCoder *)decoder {
    if (self = [super initWithCoder:decoder]) {
        self.articles = [[NSMutableArray alloc] init];
    }

    return self;
}
4b9b3361

Ответ 1

Точка -awakeFromNib заключается в том, что вы можете выполнять инициализацию, когда можете быть уверены, что все ваши соединения с другими объектами в nib были установлены.

Инфраструктура nib-load отправляет сообщение awakeFromNib каждому объект, воссозданный из архива nib, но только после того, как все объекты в архив загружен и инициализирован. Когда объект получает сообщение awakeFromNib, гарантировано, что у него есть все действия уже установлены.

Не забудьте вызвать super.

В ближайшее время вряд ли удастся уйти, и если бы он сделал так много кода, он использовал бы его, чтобы переходный период был долгим. Да, его имя происходит от старого формата файла "nib", но этот вопрос устраняет различия в расширениях файлов.

Таким образом, любой метод будет работать для вас, поскольку вы устанавливаете внутреннюю переменную экземпляра для класса. Обратите внимание, что внутри методов init (включая -initWithCoder) может быть небезопасно использовать ваши методы настройки в случае, если сеттеры полагаются на полностью инициализированный класс (исходное видео WWDC 2012 переходит на современный objective-c). Примером может быть установка свойства, которое ссылается на другой объект в файле nib.

В UIViewController подклассы -initWithCoder вызывается только при загрузке из раскадровки. Поскольку -awakeFromNib вызывается, используете ли вы раскадровки или нет, это может иметь смысл использовать это.

Другой образец, который вы могли бы рассмотреть, - ленивый получатель:

-(NSMutableArray *)articles{
    if (_articles){
        return _articles;
    }
    _articles = [[NSMutableArray alloc] init];
    return _articles;
}

Преимущество этого подхода состоит в том, что если вы хотите продолжить настройку массива, вы можете легко отбросить массив, когда он вам больше не понадобится, и в следующий раз, когда вы получите доступ к свойству, вы снова получите новый.