仪器指出内存泄漏!

时间:2009-09-06 20:45:02

标签: iphone objective-c memory-leaks instruments

嗨,我有这个代码来初始化我的课程。

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

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

有谁知道我需要解决它? 谢谢!

1 个答案:

答案 0 :(得分:6)

泄漏是在你的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),然后立即释放它。 / p>