NSArray和ARC的内存问题

时间:2012-11-17 13:35:41

标签: objective-c memory-management automatic-ref-counting

我尝试在Objective C中编写一个计算某些东西的程序。不幸的是,有很多要计算,并且程序正在运行10000次迭代的循环。总运行时间约为5分钟。 这不是问题,但在运行内存时,程序使用的内存会急剧上升(高于2GB),我认为这是因为某些值未发布。我将问题缩小到在循环内创建NSArray。有问题的代码(改为专注于问题)是这样的:

for (NSInteger k = 0; k<100000; k++) {

    NSMutableArray *mutableTestArray = [NSMutableArray new];
    for (NSInteger i=0; i<200; i++){

        NSMutableArray *subArray = [NSMutableArray new];
        for (NSInteger j=0; j<200; j++) {

            //simplified version, normally the valus for sub array are dependent on some other factors
            [subArray addObject:[NSArray arrayWithObjects:@"test", @"test", nil]];

        }
        [mutableTestArray addObject:subArray];

    }


    //do stuff with mutableTestArray
    //change parameters that go into sub array

}

如果我更换:

[subArray addObject:[NSArray arrayWithObjects:@"test", @"test", nil]];

使用:

[subArray addObject:@"test"];

它工作正常。所以我想我不得不释放我创建的数组。但是怎么样? 我启用了ARC,据我所知,如果启用了ARC,我无法手动释放对象。如果有人可以帮助我改变代码或者提示我可以学习如何正确地进行内存管理,那将会很棒。

由于

2 个答案:

答案 0 :(得分:6)

只需输入一些autoreleasepool:

@autoreleasepool {
        NSMutableArray *subArray = [NSMutableArray new];
        for (NSInteger j=0; j<200; j++) {
@autoreleasepool {

            //simplified version, normally the valus for sub array are dependent on some other factors
            [subArray addObject:[NSArray arrayWithObjects:@"test", @"test", nil]];
}
        }
        [mutableTestArray addObject:subArray];

}

答案 1 :(得分:5)

[NSArray arrayWithObjects:@"test", @"test", nil];返回一个自动释放的对象,它将在未来的某个地方发布,但不会立即发布。 使用[[NSArray alloc] initWithObjects:@"test", @"test", nil];,由于ARC,数组将几乎立即释放。 如果您不使用ARC,则代码可能如下:

NSArray* tempArr = [[NSArray alloc] initWithObjects:@"test", @"test", nil];
// use the temporary variable
[subArray addObject:tempArr];
[tempArr release];

由于您使用的是ARC,因此应删除该版本。