1

我尝试用 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,据我所知,如果启用它,我无法手动释放对象。如果有人可以帮助我更改代码或提示我可以学习如何正确进行内存管理的地方,那就太好了。

谢谢

4

2 回答 2

6

只需放入一些自动释放池:

@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];

}
于 2012-11-17T13:39:49.587 回答
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,所以您应该删除该版本。

于 2012-11-17T13:41:53.980 回答