Странная память только при использовании копирования - PullRequest
0 голосов
/ 27 ноября 2011

У меня есть класс с именем SomeClass.в его init у меня есть много строк, таких как:

SomeProperty_ = [[SomeObject alloc] initWithSomething];

В то время как свойства объявлены как

@property(retain) SomeObject *SomeProperty;

и определены как

@synthesize SomeProperty = SomeProperty_;

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

SomeProperty_ = [[SomeObject alloc] initWithSomething];

, отмечаются как утечка памяти в Инструментах.это также правильно, так как я получаю предупреждение о памяти, а затем происходит сбой, если я часто его использую.
Однако, если я создаю метод с именем dealloc, например:

-(void) dealloc
{
    self.SomeProperty = nil;

    [super dealloc];
}

С копиями тоже все в порядкеи нет предупреждений памяти или утечек.
Я думаю, это из-за моей copy реализации:

-(id)copy
{
    SomeClass *copy = [[SomeClass alloc] init];

    copy.SomeProperty.somePOD = self.SomeProperty.somePOD;

    return copy;
}

В чем проблема?что я могу сделать, чтобы решить это без пользовательских dealloc?

Ответы [ 2 ]

0 голосов
/ 27 ноября 2011

Вы должны либо использовать пользовательский метод dealloc, либо начать использовать автоматический подсчет ссылок (ARC).

Когда вы вызываете [[SomeObject alloc] init...], вы получаете право собственности на новый объект, поэтому вы должны освободить объект, когда выс этим покончено.Установка self.SomeProperty на nil делает выпуск, потому что вы объявляете свойство с атрибутом retain.

Вы делаете это в своем методе dealloc, если хотите владеть объектом SomeObject, пока ваш объект SomeClass не умрет.Если вы используете ARC, он сгенерирует для вас метод dealloc.

0 голосов
/ 27 ноября 2011

Первое, о чем я могу подумать:

Как ваш somePOD установлен на @property (???)

И когда вы говорите:
«Однако, когда я копирую объект SomeClass, а потом выпускаю его, все строки вроде

SomeProperty_ = [[SomeObject alloc] initWithSomething]; помечены как утечки памяти в инструментах. это также правильно, так как я получаю предупреждение о памяти, а затем сбой, если я часто этим пользуюсь. "

Вы имеете в виду вызов, выполненный в вашем методе init? Потому что, если это не так, вы обходите установщик и объект, который был в этой переменной до того, как это назначение утечет.

...