2011-11-27 2 views
0

У меня есть класс с именем 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?

+0

Вы знаете, что вы клонируете iOS 'copy' метод, не так ли? – Abizern

+0

@ Абизерн: Я что? Я знаю, что есть смысл копировать метод в объекте-с, но если мне нужна специальная реализация копии, могу ли я сделать это? – Dani

+0

Посмотрите на [NSCopying] (http://developer.apple.com/library/ios/# documentation/Протокол Cocoa/Reference/Foundation/Protocols/NSCopying_Protocol/Reference/Reference.html) – Abizern

ответ

0

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

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

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

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

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

0

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

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

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

Смежные вопросы