2012-05-26 4 views
2

Я понимаю, что это может не относиться только к свойствам @properties, но они будут наиболее распространенным вариантом использования. Если есть, например:Рекомендации по инициализации объектов Objective-C

@property (strong) NSObject *object; 

... 

@synthesize object = _object; 

можно инициализировать его в init метод класса она объявляется следующим образом:

- (id)init { 
    self = [super init]; 
    if (self) { 
     _object = [[NSObject alloc] init]; 
    } 
} 

или переопределить геттер и инициализирует его на первый использование:

- (NSObject *)object { 
    if (!_object) { 
     _object = [[NSObject alloc] init]; 
    } 
    return _object; 
} 

Какой из них лучше использовать? Это зависит от сценария использования (например, имеет ли объект, объявленный в нем свойство, несколько инициализаторов или тип свойства, способ его использования и т. Д.)?

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

На боковой ноте, при доступе к свойствам в методе init, лучше ли их получить как self.object или _object?

+1

Обязательно используйте 'if (self) {' в методе init до того, как вы начнете настройку свойств .... – lnafziger

+0

К сожалению. Починил это. Спасибо, что заметили. Я не пропустил это в Xcode, это просто не было частью того, о чем я говорил здесь, поэтому я забыл его здесь, глядя на текстовое поле. – Greg

ответ

2

Я лично считаю, что инициализация в методе init лучше, продолжительность жизни объекта более ясна, а также учитывает, не инициализируется ли init для объекта, не лучше ли получить это при инициализации, чем когда вы делать?

Я также предпочитаю использовать свойства self.object, поскольку он использует приемник и сеттер объекта и «я». дает понять это и избегать ситуаций, когда требуется сохранение или нет. конечно, в некоторых случаях, как в вашем примере, это может вызвать пару строк кода, но я полагаюсь на компилятор для оптимизации кода.

например.

yourobjclass* tmp = [[yourobjclass alloc] init]; 
self.object = tmp; 
[tmp release]; 
+0

Но существует ли разница между доступом напрямую или через свойство, если вы не переопределяете аксессор? – Greg

+0

Я всегда получаю доступ к свойству, но в методе 'init' я где-то читал, что лучше получить доступ напрямую. Поэтому я хотел знать. – Greg

+1

@PartiallyНастройте одну цель с кодированием, чтобы ваши намерения были понятны для других программистов, которые читают ваш код, используя self. префикс, вы даете понять, как должен обрабатываться объект, когда вы этого не сделаете, не всегда может быть самолюбивым, следует ли сохранять или нет при любых обстоятельствах. –

5

Вопреки принятому ответу, Advanced Memory Management Programming Guide говорит, что вы должны использовать переменные экземпляра в инициализаторах и в методе dealloc. См. «Не использовать методы доступа в методах инициализатора и dealloc».