#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 .