2010-09-07 3 views
1

Инструмент «Утечки» говорит мне, что у меня есть утечка памяти, когда я использую decodeObjectForKey в пределах initWithCoder. Например:iOS initWithCoder/decodeObjectForKey утечка памяти

Class.h 
{ 
MyObject *myObject; 
} 

@property (nonatomic, retain) MyObject *myObject; 

Class.m 

@synthesize myObject 

-(void)dealloc{ 
[myObject release]; 
[super release]; 
} 

-(id)initWithCoder:(NSCoder *)decoder{ 
if (self = [super init]{ 
self.myObject = [decoder decodeObjectForKey:@"MyObject"]; 
} 
return self; 
} 

По желанию в комментариях:

-(void)encodeWithCoder:(NSCoder *)encoder{ 

    [encoder encodeObject:myObject forKey:@"MyObject"]; 

} 

Утечки сообщает об утечке типа NSCFString на линии;

self.myObject = [decoder decodeObjectForKey:@"MyObject]; 

Как я понимаю, decodeObjectForKey возвращает объект с автореализацией. Поскольку я сразу присваиваю это значение свойству myObject, которое указано как (нетоксичное, сохраняемое) в определении свойства, я сохраняю автореализованный объект через метод setter свойства myObject. Затем myObject освобождается в методе dealloc. Я не понимаю, где утечка, если я правильно понимаю последовательность. Также почему это сообщается как NSCFString, когда тип MYObject?

Любые мысли будут оценены, в том числе, если мои предположения выше правильны.

+0

в следующий раз, пожалуйста, отформатируйте свой код :) – vodkhang

+0

Затем я хочу увидеть ваш encodeObject: forKey: метод реализовать – vodkhang

+0

Новое на сайте, извините за формат. Добавлено encodeObject: метод для запроса – DrCronus

ответ

5

Обратите внимание на свой метод -dealloc. Вы звоните [super release];, когда вы должны звонить [super dealloc];.

Вызов [super release] в этом случае - это то же самое, что и вызов [self release], так как вы не переопределяете метод -release. Если вы вызываете свой метод -dealloc, ваш объект уже полностью освобожден, поэтому это не нужно. Поскольку вы переопределяете метод -dealloc, вы должны позвонить [super dealloc], чтобы также освободить любую память, выделенную суперклассом.

Вы можете refer to the NSObject documentation посмотреть, как правильно закрепить dealloc.

+0

В чем разница? – SNR

+0

Обновлен мой ответ с объяснением. –

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