【问题标题】:Instruments point a memory leak !仪器点内存泄漏!
【发布时间】:2010-11-26 01:54:56
【问题描述】:

嗨,我有这个代码来初始化我的班级。

- (id)initWithSize:(int)size {

    self = [super init];

    if( self != nil )
    {
        [self setMyVector:[[NSMutableArray alloc] initWithCapacity:size]];

        for ( int i = 0; i < size; i++ ) 
        {
            [myVector addObject: [[NSMutableArray alloc] initWithCapacity:size]];
        }
    }

    return self;
}

我在 Instruments 中发现了这个漏洞!
类别:CFArray (store-deque)
事件类型:Malloc

有人知道我需要解决什么吗? 谢谢!

【问题讨论】:

  • if (self != nil) 可以替换为if (self)

标签: iphone objective-c memory-leaks instruments


【解决方案1】:

泄漏在您的 for 循环中,并且可能之前也有一个。

首先,这一行:

[self setMyVector:[[NSMutableArray alloc] initWithCapacity:size]];

如果setMyVector 保留传递的数组(根据惯例,它可能应该保留),那么您已经泄漏了数组。首先你分配并初始化数组。它的保留计数为 +1。然后将它设置到 myVector 实例变量中,这意味着它的保留计数为 +2。当您将其他内容放入 myVector 或在 dealloc 方法中释放 myVector 变量时,您将减少保留计数,这意味着它的保留计数为 +1。换句话说,它不会被释放,并且你已经泄露了数组。

另一个明确的泄漏是在你的 for() 循环中,你有:

[myVector addObject: [[NSMutableArray alloc] initWithCapacity:size]];

同样,您创建一个保留计数为 +1 的数组,然后将其添加到 myVector 数组中,该数组将再次保留它 (+2)。但是,您不再拥有指向该数组的指针,因此您已经泄露了它。

这两个泄漏都可以通过使用 [NSMutableArray arrayWithCapacity:size] 而不是 alloc/init 方法来解决。这将创建一个自动释放的数组,从而解决您的内存泄漏问题。

如果您不知道什么是自动释放,那么您可能需要考虑创建数组并将其存储到局部变量中,将其添加到 myVector(或将其设置到 myVector),然后立即释放它。

【讨论】:

    猜你喜欢
    • 2012-07-06
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    相关资源
    最近更新 更多