iOS initWithCoder/decodeObjectForKey内存泄漏

1 iphone

泄漏仪器告诉我,当我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;
}
Run Code Online (Sandbox Code Playgroud)

评论中的每个请求:

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

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

}
Run Code Online (Sandbox Code Playgroud)

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

 self.myObject = [decoder decodeObjectForKey:@"MyObject];
Run Code Online (Sandbox Code Playgroud)

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

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

Cam*_*ert 5

仔细看看你的-dealloc方法.[super release];你应该打电话的时候打电话[super dealloc];.

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

您可以参考NSObject文档来了解如何正确覆盖dealloc.