2012-05-09 3 views
0

Я получаю утечку в методе initWithCoder.Objective-c - управление initWithCoder и памятью?

Имеет ли unarchiveObjectWithData: cacheData возвращает мне автореализованный объект? чья ответственность за освобождение объекта возвращается из unarchiveObjectWithData: cacheData?

@implementation MyObject 
@synthesize something = _something; 

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    if (self = [super init]) 
    { 
     self.something = [aDecoder decodeObjectForKey:@"something"]; 
    } 
} 

- (void)dealloc 
{ 
     self.something = nil; 
     [super dealloc]; 
} 

@end 

Это где я прочитал объект из файла

MyObject *myObject = [NSKeyedUnarchiver unarchiveObjectWithData:cacheData]; 
+1

Это обсуждалось ранее, но использование методов доступа во время 'init' и' dealloc' не рекомендуется, поскольку оно может иметь непреднамеренные побочные эффекты. В таких тривиальных случаях, как выше, это не проблема, но при сложной инициализации, наблюдении через KVO или в сложных иерархиях объектов это может вызвать множество непредвиденных побочных эффектов. – dreamlax

ответ

1

ли unarchiveObjectWithData: cacheData вернуть мне autoreleased объект? чья ответственность за освобождение объекта возвращается из unarchiveObjectWithData: cacheData?

Только помните NARC. Если метод, который вы вызываете, начинается с new, alloc, retain или copy, то вы владеете любым возвращаемым объектом и должны его выпустить. Если это не так, то оно автореализовано.

+0

И, таким образом, возвращаемый объект автореализован. – JustSid

+0

Вы не должны предполагать, что он автореализован, вы должны только предположить, что вы его не владеете. Многие методы возвращают объекты, которые вы не являетесь * и *, не автореализовываются, например. '[NSFileManager defaultManager]' и другие одноэлементные типы, а также для кэшированных 'NSNumber' и т. Д. – dreamlax

+0

Я предполагал, что это был ответ, так почему я получаю утечку памяти? – aryaxt

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