Почему shoudn't я использую методы доступа в init методах

Из документации Apple об управлении памятью:

Единственные места Вы не должны использовать методы доступа установить переменную экземпляра, находятся в init методах и dealloc. Для инициализации встречного объекта с объектом числа, представляющим нуль, Вы могли бы реализовать init метод следующим образом:

Для разрешения в противоречии с быть инициализированными с количеством кроме нуля Вы могли бы реализовать initWithCount: метод следующим образом:

- initWithCount:(NSNumber *)startingCount {
    self = [super init];
    if (self) {
        count = [startingCount copy];
    }
    return self;
}

Почему нет?

7
задан Pierre Valade 6 August 2010 в 15:02
поделиться

2 ответа

См. Мой ответ на этот вопрос .

Основная причина в том, что подкласс может переопределить ваши методы доступа и сделать что-то другое. Аксессеры подкласса могут предполагать полностью инициализированный объект, то есть что весь код в методе инициализации подкласса выполнен. Фактически, ничего из этого не происходит, когда ваш метод инициализации запущен. Точно так же средства доступа подкласса могут зависеть от того, что метод dealloc подкласса не запущен. Это явно неверно, когда ваш метод dealloc запущен.

Чтобы расширить ваш пример, если бы вы вместо этого выполнили

- initWithCount:(NSNumber *)startingCount {
    self = [super init];
    if (self) {
        [self setCount: [startingCount copy]];
    }
    return self;
}

, но подкласс переопределил setCount: для выполнения чего-то другого, кроме установки вашей переменной count, у вас могли бы возникнуть проблемы.

16
ответ дан 6 December 2019 в 12:45
поделиться

просто с точки зрения ООП (поскольку у меня нет опыта работы с objective-c), вы не стали бы использовать методы объекта, который в настоящее время создается. Это возможно на некоторых языках, но у вас уже есть доступ к частным переменным. Строительство объекта еще не завершено, поэтому он не готов к эксплуатации. Как только объект построен, он находится в заведомо исправном состоянии (по крайней мере, так предполагается) и может работать.

1
ответ дан 6 December 2019 в 12:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: