iOS initWithCoder / decodeObjectForKey内存泄漏

时间:2010-09-07 02:06:34

标签: iphone

Leaks仪器告诉我在decodeObjectForKey内使用initWithCoder时发生了内存泄漏。例如:

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"];

}

Leaks报告线路上存在NSCFString类型的泄漏;

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

据我了解,decodeObjectForKey返回一个自动释放的对象。由于我立即将该值赋给myObject属性(在属性定义中指定为(无毒,保留)),因此我通过myObject属性的setter方法保留自动释放的对象。然后在dealloc方法中释放myObject。如果我正确理解序列,我不明白泄漏在哪里。另外,为什么当类型为MYObject时报告为NSCFString?

任何想法都会受到赞赏,包括我的上述假设是否正确。

1 个答案:

答案 0 :(得分:5)

仔细查看您的-dealloc方法。当您应该致电[super release];时,您正在致电[super dealloc];

在这种情况下调用[super release]与调用[self release]相同,因为您没有覆盖-release方法。如果调用了-dealloc方法,则您的对象已经完全释放,因此这是不必要的。由于您要覆盖-dealloc方法,因此必须调用[super dealloc]以释放超类分配的任何内存。

您可以refer to the NSObject documentation查看如何正确覆盖dealloc。