Вопрос по управлению памятью в iOS - PullRequest
0 голосов
/ 02 апреля 2011

У меня вопрос об управлении памятью. У меня есть переменная экземпляра, которую я ранее выделил в методе init *. В какой-то момент в моей программе я сохранил этот объект. В моем методе dealloc, если я установлю этот объект на nil, он будет правильно освобожден? Позвольте мне показать пример. Это класс A.h:

@interface A: NSObject {
  B *bvariable;
}
-(id) init;

и его реализация:

 @implementation A

  -(id) init: { 
      bvariable= [[B alloc] init];


       /**
        *  Let say for some reason, I called   
       */   
       [bvariable retain];
   }
}

-(void) dealloc {
     bvariable = nil;
     [super dealloc];
}

У меня вопрос: когда GC вызовет dealloc в классе A, будет ли bvrariable правильно освобожден?

Мое предположение - нет, потому что, поскольку я сохранил этот объект, я должен дважды вызвать release , чтобы освободить этот объект. Установка объекта в nil не освобождает их, так как я все еще отправляю сообщения объекту bvrariable. Но кто-то сказал мне обратное.

Может кто-нибудь просветить меня, плз?

Спасибо за ваш совет !!

Ответы [ 2 ]

0 голосов
/ 02 апреля 2011

Как правило, каждый метод, который начинается с alloc / init / copy / new, должен возвращать сохраненный объект.Если вы сохраните этот объект снова, то количество сохранений будет равно 2. Чтобы полностью освободить объект, вам придется отпустить дважды.

История об освобождении объекта при установке его на ноль применима, только если вы используете сборщик мусора (GC).В настоящее время это не доступно для iOS, только Mac OS.

0 голосов
/ 02 апреля 2011

Мой вопрос, когда GC позвонит сделка на А класс, будет быть правильно освобожден?

Нет,

1) GC не используется в диспетчере памяти iOS.

2) В dealloc вы просто устанавливаете этот указатель на nil (совершенно бессмысленно делать в dealloc) - сам объект не освобождается и / или не освобождается.

Я думаю, нет, потому что, так как я сохранил этот объект, поэтому я должен позвонить отпустите дважды, чтобы освободить этот объект.

правый. Кстати, я не вижу никакой разумной причины, чтобы сохранить этот объект после alloc - вы уже заявили право собственности на него.

...