【问题标题】:memory leaks with arc in init method在 init 方法中使用 arc 导致内存泄漏
【发布时间】:2013-03-19 13:47:30
【问题描述】:

为什么泄漏仪器告诉我这是泄漏?我正在使用 ARC。 我应该怎么做才能不泄漏? 顺便说一句,我尝试将“强”更改为“弱”,但随后收到警告 "Assigning retained object to weak property; object will be released after assignment"

@property (nonatomic, strong) NSMutableArray *myArray;

-(id)init{
    self = [super init];
    if (self){
        _myArray = [[NSMutableArray alloc] init]; //<== leak here
    }
    return self;
}

【问题讨论】:

  • 您确定myArray 泄漏了吗?也可能是它的所有者泄漏了 (self)。
  • 是的,我用 _myArray 尝试过,但仍然泄漏(我更新了上面的代码以显示该示例)
  • @Harris:您指向的代码行没有泄漏。具有此属性的对象正在泄漏,或者您将数组传递给保留并泄漏它的其他代码。尝试打开对象分配工具,它可以跟踪此特定数组发生的所有保留/释放,您可以使用它来找出不平衡的位置。
  • 这不是泄漏,使用 ARC,释放是在自动生成的 dealloc 方法中自动生成的。也许还有其他东西保留了该数组,因此它不会被释放。

标签: ios automatic-ref-counting memory-leaks


【解决方案1】:

您确定 ARC 确实已打开吗?尝试添加类似 [self release] 的内容,看看它是否可以编译。如果是这样,ARC 就没有打开。

【讨论】:

  • 是的,我已验证 ARC 已打开。
  • 那听起来像一个静态分析器错误。没有什么应该是泄漏。你有没有检查过 Instruments 是否真的泄漏了?
  • @Catfish_Man:他已经在使用泄漏仪器,而不是静态分析仪。
【解决方案2】:

您不应该在initdealloc 方法中通过他们的getter 访问properties。相反,您应该直接设置支持 ivar,如下所示:

-(id)init
{  
  self = [super init]; 

  if (self)
  {  
    _myArray = [[NSMutableArray alloc] init]; //<== leak here
  } 

  return self;  
}

注意:如果您在最新版本的 Xcode 中使用 auto-synthesize 功能 - 也就是说,您没有手动编写 @synthesize 行 - 支持 ivar 的名称将与您的属性相同前面有一个下划线。

试试上面的这个,看看泄漏是否消失。

祝你好运。

【讨论】:

  • 我同意您的一般建议,但进行此更改将对代码的内存语义产生零影响。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-15
  • 2016-02-04
  • 1970-01-01
  • 2013-05-26
  • 2015-06-18
相关资源
最近更新 更多