Я создавал пользовательские инициализаторы для своих объектов только потому, что это похоже на лучшую практику, чем настройку их переменных другими способами. В этих инициализаторах я обычно устанавливаю переменные объекта, а затем возвращаю вызов основному init.Инициализаторы пользовательских объектов
Так, например, в UIViewController подкласс мой код будет выглядеть примерно так:
-(id)initWithValue:(int)val {
self.value = val;
return [self initWithNibName:nil bundle:nil];
}
где value
представляет собой целое число, которое принадлежит к этому ViewController подкласса, и, как правило, больше значения, чем это.
Однако в последнее время я начал сначала настраивать себя, потому что думал, что self = [self init...]
заменит текущий экземпляр класса, и, таким образом, я потеряю этот экземпляр себя. Итак, я начал делать:
-(id)initWithValue:(int)val {
self = [self initWithNibName:nil bundle:nil];
self.value = val;
return self;
}
Затем я недавно проверил оригинальную версию и понял, что все работает должным образом, и изменение было ненужно.
Итак, мой вопрос заключается в следующем:
- Что делает [супер initWithNibName: расслоение:] сделать, создающее это создать объект, но не заменить исходный объект?
- Является ли одна из двух версий лучше, чем другая, или они оба эквивалентны? Если лучше, что нужно использовать?
Спасибо, продвинутый!
Вот что я подумал, но я попытался установить значения, а затем выполнил 'self = [self initWithNibName: bundle:]', затем распечатал значения, и они были верны. Я предполагаю, что я не всегда будет изменен, но, как правило, безопаснее делать это по-своему. – Jsdodgers
Кроме того, спасибо за отзыв о '_value'. Просто чтобы убедиться, что я это понимаю, при использовании '_value',' [self setValue:] 'не будет вызван, правильно? И если это так, единственная причина не использовать self.value или есть другой? – Jsdodgers
Значение является свойством в вашем случае, поэтому при синтезе используйте этот стандартный код ... @synthesize value = _value; Вы также можете получить значение с помощью [self setValue:]. –