Нужно ли сохранять параметры, переданные пользовательскому методу initWith?

#objective-c #memory-management

#objective-c #управление памятью

Вопрос:

например:

в интерфейсе:

 @property(retain) NSObject* anObject;
  

в интерфейсе,
при реализации:

 -(id)initWithAnotherObject:(NSObject*)another{
    if(self = [super init]){
         anObject = another;    //should this be anObject = [another retain]?
    }
    return self;
}
  

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

1. Там, где у вас есть NSObject в примерах кода, вам действительно нужно NSObject* . Объекты Objective-C всегда передаются по ссылке, но, в отличие от Java, вы должны явно указать компилятору, используя указатели на NSObject .

2. о, это опечатка, спасибо.

Ответ №1:

Да, поскольку вы не можете гарантировать, что «другое» время жизни будет таким же, как время жизни создаваемого вами объекта, вам нужно убедиться в этом, сохранив его в методе init (и не забудьте освободить его в методе dealloc). Итак, правильно следующее:

 ...
if(self = [super init]){
     anObject = [another retain];
}
...
  

Еще одна вещь — определяя свойство сохранения для anObject, вы говорите, что становитесь владельцем этого объекта и, следовательно, вы должны освободить его в методе dealloc. Если вы не сохраните «другой» параметр в методе init, он в конечном итоге будет выпущен (либо в методе dealloc, либо в методе setter) без сохранения — так что ваше приложение может аварийно завершать работу с EXEC_BAD_ACCESS ошибкой.

Ответ №2:

Я думаю, что это хорошая практика

 self.anObject = another;
  

но это то же самое

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

1. Это не то же самое, используя self, вы вызываете установщик, который может быть синтезирован как retain .