2011-03-05 72 views
2

我一直在處理這段代碼幾天,試圖確定一些內存泄漏的原因。在「for循環」之後,幾乎每一行都在泄漏性能工具中產生內存泄漏百分比。從多維數組內存泄漏:NSMutableArray,NSArray,addObject和insertObjectAtIndex

我一直在嘗試各種排列,以使其工作。

這是我現在運行的嘗試,並得到它的底部代碼:

-(void)populateArrays 
{ 
    NSArray *arrTempSorted; 
    [arrContacts removeAllObjects]; 
    [arrZzoneContacts removeAllObjects]; 
    [arrNormalContacts removeAllObjects]; 

    for(int i = 0 ; i < 200 ; i++) 
    { 
     [arrZzoneContacts addObject:[[[NSArray alloc] initWithObjects: [NSNumber numberWithInt:1], @"Composite Name", @"YES", @"first name", @"last name", @"first", nil] autorelease]]; 
     [arrNormalContacts insertObject:[[[NSArray alloc] initWithObjects: [NSNumber numberWithInt:1], @"Composite Name", @"YES", @"first name", @"last name", @"first", nil] autorelease] atIndex:[arrNormalContacts count]]; 
     [arrContacts addObject:[[[NSArray alloc] initWithObjects: [NSNumber numberWithInt:1], @"Composite Name", @"YES", @"first name", @"last name", @"first", nil] autorelease]]; 
    } 

    arrTempSorted = [arrContacts sortedArrayUsingFunction:order context:NULL]; 
    arrContacts = [arrTempSorted mutableCopy]; 

    arrTempSorted = [arrZzoneContacts sortedArrayUsingFunction:order context:NULL]; 
    arrZzoneContacts = [arrTempSorted mutableCopy]; 

    arrTempSorted = [arrNormalContacts sortedArrayUsingFunction:order context:NULL]; 
    arrNormalContacts = [arrTempSorted mutableCopy]; 

    //[arrTempSorted release]; 

} 

陣列和功能都在appDelegate.h文件。該陣列進行初始化像這樣:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{  
    //Global variables 
    arrContacts = [[NSMutableArray alloc] init]; 
    arrZzoneContacts = [[NSMutableArray alloc] init]; 
    arrNormalContacts = [[NSMutableArray alloc] init]; 

    // Override point for customization after application launch. 
    [window addSubview:tabBarController.view]; 
    [self.window makeKeyAndVisible]; 

    return YES; 
} 

我試過在聲明的didFinishLaunchingWithOptions數組然後將其分配給arrContacts(例如),然後釋放它的方法,但我得到的「壞訪問」錯誤,當我們進入populateArrays方法。

任何有識之士將不勝感激,並請讓我知道如果我能在你的第二個代碼摘錄提供更多的細節

回答

2

您要爲arrContacts分配內存,arrZzoneContactsarrNormalContacts。然後,在for循環之後,您通過複製arrTempSorted不同的實例分配更多的內存NSMutableArray。當您將這些新實例指定給arrContacts,arrZzoneContactsarrNormalContacts變量時,您將失去對最初爲其分配的內存的引用,因此您不再有機會釋放它,因此泄漏。

當您複製某些內容時,您正在創建一個新實例。如果你對這些變量所做的一切都是存儲一個副本,那麼你不需要首先分配這個實例,複製就可以爲你做。如果你確實需要這個原始實例,那麼在重新分配這些變量之前釋放它。

欲瞭解更多信息,請參閱the Memory Management Programming Guide

1

正如Jim所說的,你正在覆蓋導致泄漏的arrContacts數組(和其他數組)。

作爲一個側面說明,儘管你可以完全避免這個問題,因爲你的arrContacts(和其他數組)已經是可變的了。 -sortedArrayUsingFunction:context方法是NSArray類的一部分,它返回一個包含結果的非可變數組。但是,NSMutableArray有一個名爲-sortUsingFunction:context的方法,它將執行完全相同的排序,但它會在適當的位置執行並更新arrContacts數組本身。無需複製到其他陣列和從其他陣列。

+0

Hi-非常感謝您的及時和翔實的迴應!我目前遇到了泄漏儀器崩潰我的應用程序的問題,所以目前我無法確認成功或失敗。我第一次嘗試實施這些解決方案時遇到了一些錯誤訪問錯誤。當我解決了這些問題並讓你知道我的結果是什麼時,我會回信。 – Mark 2011-03-07 22:49:52

+0

後續操作:我使用NSMutableArray的sortUsingFunction:context方法成功解決了泄漏問題。再次感謝你的幫助!!不良訪問是由於一個釋放被稱爲下行線,這是不必要的,一旦我修好了泄漏。 – Mark 2011-03-14 18:02:46