【问题标题】:Objective-c - initWithCoder and memory management?Objective-c - initWithCoder 和内存管理?
【发布时间】:2012-05-09 23:08:44
【问题描述】:

我在 initWithCoder 方法中遇到了漏洞。

unarchiveObjectWithData:cacheData 会返回一个自动释放的对象吗? unarchiveObjectWithData:cacheData 返回的对象由谁负责释放?

@implementation MyObject
@synthesize something = _something;

- (id)initWithCoder:(NSCoder *)aDecoder
{
    if (self = [super init])
    {
         self.something = [aDecoder decodeObjectForKey:@"something"];
    }
}

- (void)dealloc
{
        self.something = nil;
        [super dealloc];
}

@end

这是我从文件中读取对象的地方

MyObject *myObject = [NSKeyedUnarchiver unarchiveObjectWithData:cacheData];

【问题讨论】:

  • 之前已经讨论过,但不鼓励在initdealloc 期间使用访问器方法,因为它可能会产生意想不到的副作用。在像上面这样的微不足道的情况下,这不是问题,但在复杂的初始化、通过 KVO 观察或复杂的对象层次结构中,它可能会导致很多意想不到的副作用。

标签: objective-c ios nskeyedarchiver nscoding


【解决方案1】:

unarchiveObjectWithData:cacheData 会返回一个自动释放的对象吗? unarchiveObjectWithData:cacheData 返回的对象由谁负责释放?

记住 NARC。如果您调用的方法以newallocretaincopy 开头,那么您拥有任何返回的对象并且必须释放它。如果没有,则自动释放。

【讨论】:

  • 因此返回的对象是自动释放的。
  • 你不应该假设它是自动发布的,你应该只假设你不拥有它。许多方法返回您不拥有的对象 并且 不会自动释放,例如[NSFileManager defaultManager] 和其他单例类型,以及缓存的 NSNumber 等。
  • 我猜这就是答案,那为什么会出现内存泄漏?
  • 也许你在代码的其他地方有一个不平衡的保留。您需要在对象的整个生命周期中跟踪所有保留和释放,然后将它们配对以查看它们是否平衡。当然,您会使用 Instruments 来收集数据,但分析数据取决于您。另一个有用的工具是静态分析器(构建和分析)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-12
  • 1970-01-01
相关资源
最近更新 更多