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?
任何想法都会受到赞赏,包括我的上述假设是否正确。
答案 0 :(得分:5)
仔细查看您的-dealloc
方法。当您应该致电[super release];
时,您正在致电[super dealloc];
。
在这种情况下调用[super release]
与调用[self release]
相同,因为您没有覆盖-release
方法。如果调用了-dealloc
方法,则您的对象已经完全释放,因此这是不必要的。由于您要覆盖-dealloc
方法,因此必须调用[super dealloc]
以释放超类分配的任何内存。
您可以refer to the NSObject documentation查看如何正确覆盖dealloc。