Номер 1, вероятно, правильный.
ClassOne *ob = [[ClassOne alloc] init]; // do i should use autorelease here ?
Когда вы звоните [ClassOne alloc]
, вы получаете объект со счетом удержания 1 и несете ответственность за освобождение.
self.O = ob;
Предполагая, что self.O
является свойством retain
, а не assign
, self.O
/ ob
будет иметь счет 2 хранения.
[ob release];
Теперь self.O
/ ob
будет иметь счет сохранения 1. Это release
совпадает с alloc
. Оставшийся счет удержания принадлежит self
, поэтому вам нужно помнить, чтобы выпустить O
, когда self
закончится с ним.
-(void)dealloc{
[O release]; // is this correct ??
}
Хорошо. Вы не забыли выпустить O
. Теперь O
будет полностью освобожден, когда self
освобожден. (Примечание: вы должны позвонить [super dealloc]
в конце dealloc
.)
- (void) runIt {
ClassOne *ob = [[ClassOne alloc] init];
[classTwoOb takeParam:ob];
}
Вы должны отпустить ob
после вызова takeParam:
. Методы отвечают за сохранение объектов, которые они хотят сохранить. Если takeParam:
сохраняет ob
в classTwoOb
, его следует сохранить до возврата метода. Если нет, то не должно.
Используйте autorelease
в методах, которые возвращают объекты, которые они создали. Это дает вызывающей стороне возможность сохранить объект, если он этого хочет, или нет, если он не нужен долго. Исключением являются методы, используемые для создания объектов, которые всегда должны называться alloc
, new
или *copy*
и должны возвращать объект со счетчиком ссылок 1, что делает вызывающую функцию ответственный за выпуск.
Чтобы по-настоящему научиться управлению памятью в Objective-C, я рекомендую прочитать Руководство по программированию управления памятью, особенно раздел Правила управления памятью .