Главная » iPhone, Objective-C, Программирование для iOS и MacOS » Простейший метод init

0

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

Допустим, в каждом экземпляре Appliance переменная voltage должна инициализироваться значением 120. В файле Appliance.m добавьте свою реализацию init, переопределяя тем самым метод init класса NSObject.

-­‐  (id)init {

// вызов метода init класса NSObject self = [super init];

// присваивание начального значение voltage? voltage = 120;

// возвращение указателя на новый объект object return self;

}

Теперь при создании нового экземпляра Appliance переменная voltage по умолчанию инициализируется значением 120. (Учтите, что это никак не влияет на

работу методов доступа. После того как экземпляр будет инициализирован, переменная может быть изменена обычным образом, то есть с использованием setVoltage:.)

Обратите внимание  на  вызов  метода init суперкласса;  он  инициализирует переменные экземпляра, объявленые в суперклассе, и возвращает указатель на инициализированный объект. В большинстве случаев такая схема работает безупречно. Тем не менее  некоторые классы содержат аномальные  методы init. Аномалии делятся на две разновидности:

•  Метод  init выполняет  какую-то  хитрую  оптимизацию,  уничтожает  исходный объект, выделяет память для другого объекта и возвращает новый объект.

•  Попытка  выполнения  init завершается  неудачей,  метод  уничтожает  объект  и возвращает nil.

В первом случае фирма Apple требует, чтобы self был присвоен указатель на объект, возвращаемый методом init суперкласса. Мы делаем это в первой строке своего метода init.

Во втором случае Apple рекомендует проверить, что инициализатор суперкласса возвращает действительный объект, а не nil. И это понятно – бессмысленно выполнять пользовательскую настройку несуществующего объекта. Измените метод init в соответствии с рекомендациями Apple:

-­‐  (id)init {

// вызов метода init класса NSObject self = [super init];

// метод вернул значение, отличное от nil?

if (self) {

// присваивание начального значения voltage voltage = 120;

}

return self;

}

Откровенно говоря, такие проверки необходимы только в очень специфических ситуациях, и на практике многие программисты Objective-C пропускают их. Тем не менее в книге мы всегда будем использовать такие проверки, потому что фирма Apple рекомендует именно так подходить к реализации методов init.

Использование методов доступа

Наш метод init класса Аррliаnсе отлично работает, но я хочу показать другую разновидность, которая часто встречается в коде других людей. Обычно я выполняю простое присваивание в методе init но многие программисты используют метод доступа. Внесите некоторые изменения в метод init:

-­‐  (id)init {

// вызов метода init класса NSObject self = [super init];

// метод вернул значение, отличное от nil? if (self) {

// присваивание начального значения voltage [self setVoltage:120];

}

return self;

}

В большинстве случаев нет особых причин предпочитать одно решение другому, но зато есть хорошая тема для спора. Сторонник присваивания говорит: «Методы доступа не должны использоваться в init! Метод доступа подразумевает, что объект готов к использованию, а состояние-готовности появляется только после завершения init». На это сторонник методов доступа отвечает: «Да ладно». В реальном мире это почти никогда не создает проблем. Я использую свой метод доступа повсюду, где задаю значение этой переменной. На самом деле в подавляющем большинстве случаев можно использовать любой из двух способов.

Источник: Аарон Хилегас, «Objective-C. Программирование для iOS и MacOS», 2012 г.

По теме:

  • Комментарии