内存泄漏来自多维数组:NSMutableArray,NSArray,addObject和insertObjectAtIndex

时间:2011-03-05 00:52:51

标签: iphone objective-c nsmutablearray nsarray

我一直在使用这段代码几天试图确定一些内存泄漏的原因。 “for循环”之后的几乎每一行都会在泄漏性能工具中产生内存泄漏百分比。

我一直在尝试各种排列让它发挥作用。

这是我现在正在运行的代码,试图找到它的底部:

-(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 个答案:

答案 0 :(得分:3)

您正在为第二个代码摘录中的arrContactsarrZzoneContactsarrNormalContacts分配内存。然后,在for循环之后,通过复制NSMutableArray不同 arrTempSorted实例分配更多内存。当您将这些新实例分配给arrContactsarrZzoneContactsarrNormalContacts变量时,您将丢失对最初为其分配的内存的引用,因此您不再有机会释放它,因此泄漏。

复制内容时,您正在创建新实例。如果您正在使用这些变量进行存储副本,那么您不需要首先分配实例,而是为您复制。如果确实需要原始实例,则在重新分配这些变量之前将其释放。

有关详细信息,请参阅the Memory Management Programming Guide

答案 1 :(得分:2)

正如Jim所说,你正在覆盖导致泄漏的arrContacts数组(以及其他数组)。

作为旁注,您可以完全避免此问题,因为您的arrContacts(和其他数组)已经是可变的。 -sortedArrayUsingFunction:context方法是NSArray类的一部分,它返回一个带有结果的非可变数组。但是,NSMutableArray有一个名为-sortUsingFunction:context的方法,它将执行完全相同的排序,但它会在适当的位置执行它,只需更新arrContacts数组本身。无需复制到其他阵列和从其他阵列复制。