Назначенный инициализатор - PullRequest
3 голосов
/ 29 января 2012
-(id)initWithStrAndDate: (NSString *)inString date:(NSDate *)inDate
{
  if (self = [super init])
  {
    [self setStr:inString];
    [self setDate:inDate];
  }
  return self;
}

-(id)initWithStr: (NSString *)inString
{
      return [self initWithStrAndDate:inString date:[NSDate date]];
}

-(id)init
{
  return [self initWithStr:nil];
}

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

return [self initWithStrAndDate:inString date:[NSDate date]];

это неправильно?Не должно ли это быть:

return [self initWithStrAndDate:inString date:nil];

А также, почему мы используем 3 разных инициализатора?Я имею в виду, когда мы используем "- (id) init" или "- (id) initWithStr: (NSString *) inString" или первый?

Ответы [ 3 ]

10 голосов
/ 29 января 2012

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

Другие инициализаторы называются вторичные инициализаторы и должны , через вызовы к self, в конечном итоге вызывая один из назначенныхинициализаторы.(См. Основы какао - несколько инициализаторов .)

У этой модели есть два основных следствия:

  • Вы избегаете дублирования кода и косвенных ошибок;для большинства классов один инициализатор выполняет всю работу;и
  • При создании подклассов вам нужно только переопределить инициализаторы, назначенные суперклассами, и примитивные методы (эквивалент неинициализированного метода для обозначенных инициализаторов), как все другие методы суперклассакласс в конечном итоге называет это.Конечно, вы можете переопределить больше методов, и это необходимо сделать, если вам нужно изменить поведение (см. Основы какао - снова несколько инициализаторов .)

Так что ваш пример верен - 1назначенный инициализатор и 2 вторичных инициализатора, которые вызывают назначенный инициализатор через вызов self.

3 голосов
/ 29 января 2012

Есть 3 различных инициализатора, поэтому вы можете использовать любой из них - ни один из них не является неправильным, они позволяют вам инициировать класс с переменными данными - в основном для удобства, так как в конце они все делают одно и то же.

Вы можете инициировать класс с указанной строкой и датой (первый и самый длинный инициализатор),

, или вы можете указать только строку и установить дату в текущее время,

или вы можете иметь пустую строку и текущее время.

обратите внимание, что вызов:

[self init];

равен вызову

[self initWithStr: nil];

, и это в свою очередьравно

[self initWithStrAndDate: nil date:[NSDate date]];

Итак, в конце концов, вы все равно вызываете один и тот же инициализатор.

0 голосов
/ 29 января 2012

У вас есть один назначенный инициализатор, который читает корневой инициализатор или метод, который выполняет всю работу.Другие методы инициализатора вызывают только этот корневой инициализатор со значениями по умолчанию для отсутствующих параметров.
Вы используете [NSDate date] вместо nil, просто потому что текущая дата является вашим значением по умолчанию.следует использовать зависит от значений, которые вы хотите, чтобы объект был установлен.Если у вас есть строка и дата, вы используете строку и дату.Если у вас нет даты, вы используете дату без даты, только строку и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...