【问题标题】:iOS initWithCoder/decodeObjectForKey memory leakiOS initWithCoder/decodeObjectForKey 内存泄漏
【发布时间】:2010-09-07 02:06:33
【问题描述】:

Leaks 工具告诉我,当我在 initWithCoder 中使用 decodeObjectForKey 时出现内存泄漏。例如:

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;
}

cmets 中的每个请求:

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

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

}

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

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

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

任何想法都将不胜感激,包括我的上述假设是否正确。

【问题讨论】:

  • 下次请格式化你的代码:)
  • 那我想看看你的 encodeObject:forKey: 方法实现
  • 新网站,对格式感到抱歉。添加了 encodeObject: 每个请求的方法

标签: iphone


【解决方案1】:

仔细查看您的-dealloc 方法。当你应该打电话给[super dealloc];时,你却打电话给[super release];

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

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

【讨论】:

  • 用解释更新了我的答案。
猜你喜欢
  • 2010-09-15
  • 1970-01-01
  • 1970-01-01
  • 2012-02-18
  • 1970-01-01
  • 1970-01-01
  • 2014-06-09
  • 2016-10-16
相关资源
最近更新 更多