2009-09-06 72 views
1

嗨,我有这个代码来初始化我的课程。仪器指向内存泄漏!

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

任何人都知道我需要解决它吗? 谢谢!

+0

'if(self!= nil)'可以被'if(self)'替代。 – 2009-09-06 21:41:13

回答

6

泄漏位于您的for循环中,也可能是之前的循环。

首先,这条线:

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

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

其他的,明确的泄漏是你的()循环,那就是你有内:

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

再次,你创建的+1保留计数的数组,然后将其添加到myVector数组,它会再次保留它(+2)。但是,你不再有指向数组的指针,所以你已经泄露了它。

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

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

+0

非常感谢,我的工作! – Hitcurst 2009-09-07 01:20:48