Два вопроса об управлении памятью iPhone - PullRequest
0 голосов
/ 25 августа 2009

У меня два вопроса.

1) Какие из них выпустят ob?

- (void){
  ClassOne *ob = [[ClassOne alloc] init]; // should I use autorelease here?
  self.O = ob;
   [ob release]; // is this correct ??
}

или

-(void)dealloc{
 [O release]; // is this correct?
}

2) Есть два класса, ClassOne и ClassTwo. Метод в ClassTwo:

- (void) takeParam:(ClassOne *pt) {
  // something going here
}

и есть метод в третьем классе

- (void) runIt {
   ClassOne *ob = [[ClassOne alloc] init];
   [classTwoOb takeParam:ob];
}

Где я должен вызвать release для объекта ClassOne?

Ответы [ 2 ]

3 голосов
/ 25 августа 2009

Метод -release только уменьшает количество сохраняемых объектов. Когда счет сохранения достигает нуля, среда выполнения вызовет -dealloc.

Если в любое время вы отправляете сообщение alloc, copy или retain, вы должны позже позвонить release или autorelease.

Подробнее см. Этот отличный ответ .

2 голосов
/ 25 августа 2009

Номер 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, я рекомендую прочитать Руководство по программированию управления памятью, особенно раздел Правила управления памятью .

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