Apple рекомендует НЕ использовать методы свойств в инициализаторах, однако я не уверен в том, что протокол должен следовать, если вам нужно вызвать метод из инициализатора, который также нужно вызывать из другого места, где в программе после инициализации объекта. Например, у вас есть:Разочарование шаблона в объекте C
- (id) init
{
self = [super init];
if (self)
{
[self someMethod];
}
return self;
}
- (void) someMethod
{
_x = 0; \\ or self.x = 0 when this method is not called from initializer
}
someMethod
содержит кучу Ивар в нем. Проблема в том, что ее также нужно называть else, где в коде позже после инициализации объекта. Я бы хотел, чтобы аксессоры не были доступны в инициализаторе при его вызове оттуда, но я также хотел бы, чтобы они были доступны, когда someMethod
вызывается из другого места. Есть ли опрятный путь вокруг этого шаблона? При использовании NSObject
? При использовании UIView
? При использовании UIViewController
?
Это не обязательное правило, а предложение. Если вы понимаете, что делаете, то совершенно правильно установить переменную свойства backing напрямую. Единственный вред приходит от этого, не задумываясь. – borrrden
Если у вас нет сеттеров, которые обрабатывают другие переменные экземпляра, просто игнорируйте эту рекомендацию. –
Как говорит Боррден, это всего лишь предложение. Нет никакой проблемы, чтобы использовать их внутри init. Проблема возникнет, если вы используете KVO, как правило, вы не хотите запускать ее во время инициализации или освобождения. [EDIT] или как Bauch говорит, если вы используете пользовательский сеттер/getter. – Andrea