2009-09-06 62 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