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?
任何想法都会受到赞赏,包括我的上述假设是否正确.
仔细看看你的-dealloc方法.[super release];你应该打电话的时候打电话[super dealloc];.
[super release]在这种情况下调用与调用相同[self release],因为您没有覆盖该-release方法.如果-dealloc调用了您的方法,则您的对象已经完全释放,因此这是不必要的.由于要覆盖该-dealloc方法,因此必须调用[super dealloc]以释放超类分配的所有内存.
您可以参考NSObject文档来了解如何正确覆盖dealloc.
| 归档时间: |
|
| 查看次数: |
2060 次 |
| 最近记录: |