【问题标题】:Am I leaking this ObjectiveC Object?我是否泄漏了这个 ObjectiveC 对象?
【发布时间】:2012-01-23 02:57:06
【问题描述】:
@interface foo: NSObject
@property (nonatomic, retain) NSMutableArray *aMutableArray;
@end

@implementation
@synthesize aMutableArray

-(void)somefunction {
    // Illustration
    self.aMutableArray = [[[NSMutableArray alloc]init]autorelease];
    self.aMutableArray = [[[NSMutableArray alloc]init]autorelease];
    self.aMutableArray = [[[NSMutableArray alloc]init]autorelease];
}
@end

我已经在程序的其他部分编写了与此类似的代码,但我需要确定这不会导致内存泄漏。以我对autorelease的理解,这个对象是正确释放的吧?

[编辑 - 添加问题] 不过有个问题:上面的属性有一个 retain 属性,所以当编译器创建 setter 函数时,setter 代码看起来像这样:

somecode..
retain newObj
release oldObj
somecode..

在上面的代码中,我将 3 个对象分配给了一个 MutableArray。 每次分配它们时,setter 函数都会对 newObj 执行 retain 并在 oldObj 上执行 release。那么既然setter方法已经释放了,那么当autorelease启动第二次释放对象时会不会有问题呢?

【问题讨论】:

  • 是的。但是你有一个错字:缺少括号 [ 在 NSMutableArray 前面
  • 我已经编辑了上面的问题,以包括我对您的回答提出的后续问题。谢谢
  • 不,它不会泄漏。您正在自动释放它们,因此即使设置器保留它们,自动释放池也会被刷新,并且设置器中的释放也将被调用,因此 2 的保留计数最终将为 0。再说一遍,这段代码没有错:)

标签: iphone objective-c memory-management memory-leaks autorelease


【解决方案1】:

是的,如果你也释放dealloc方法,它就会正确释放:

- (void) dealloc{
   [aMutableArray release];
   [super dealloc];
}

还请注意,您可以使用 NSMutableArray 的同等便利 +array 方法缩短代码:

self.aMutableArray = [NSMutableArray array];

【讨论】:

  • 感谢您提供便捷的方法提示。这只是说明,代码要复杂得多:)
  • 我已经编辑了上面的问题,以包括我对您的回答提出的后续问题。谢谢。
  • 哎呀谢谢,本来打算把省略号放在那里,但由于某种原因忘记了
  • @theface 回答您的第二个问题,没有过度发布,因为您对autorelease 的调用与您对alloc 的调用相平衡。 -dealloc 中的 release 是平衡 setter 中的 retain 所必需的。
  • @DaveDeLong 好的,我猜 setter 函数的编译器实现比简单地保留 newObj 并释放 oldObj 复杂得多?如果就这么简单,我认为可能会有过度发布。我更倾向于相信你,因为你的声望很高,而且你是 Apple 框架开发人员 :)
猜你喜欢
  • 1970-01-01
  • 2012-11-11
  • 2011-01-16
  • 2011-09-09
  • 2016-09-20
  • 1970-01-01
  • 1970-01-01
  • 2011-05-16
  • 1970-01-01
相关资源
最近更新 更多