NSArray不在ARC Objective-C中解除分配

时间:2013-10-30 13:31:07

标签: objective-c matrix automatic-ref-counting

我正在尝试在Objective-C中为大学项目编写命令行应用程序。该项目需要矩阵操作,所以我编写了一个类来处理所有矩阵方法(加法和乘法等)。我的矩阵方法如下所示:

- (NSArray *)sumMatrices:(NSArray *)matrices
{
    NSMutableArray *sum = [[NSMutableArray alloc] init];

    NSInteger cols = [matrices[0][0] count];
    NSInteger rows = [matrices[0] count];

    for (int i = 0; i < rows; i++) {

        NSMutableArray *row = [[NSMutableArray alloc] init];

        for (int j = 0; j < cols; j++) {

            CGFloat value = 0.0;

            for (NSArray *array in matrices) {
                value += [array[i][j] doubleValue];
            }

            [row addObject:[NSNumber numberWithDouble:value]];

        }

        [sum addObject:[row copy]];
        row = nil;

    }

    return [sum copy];

}

然而,这个程序是一个大问题,我使用了Objective-c for iOS期望ARC处理所有内存分配和释放没有问题,但是在这种情况下NSMutableArray'sum'永远不会被解除分配,并且因为这个方法是在循环中调用的,它运行了数千次(使用RK4建模双摆),内存使用量增加并使程序变得非常慢。

一旦此方法返回,是否有任何原因导致此NSMutableArray未被释放?

2 个答案:

答案 0 :(得分:1)

您的问题不是关于此代码的问题,而是关于它周围的代码的更多信息。让我们假设您的代码看起来像这样:

NSArray *matricies; //Declared somewhere else;
NSMutableArray *results = [[NSMutableArray alloc] init];

for (int i=0; i < [matricies count] - 1; i++) {
    for (int j=i+1; j < [matricies count]; i++) {
        NSArray *sum = [self sumMatrices:@[matricies[i], matricies[j]]];
        [results addObject:sum];
    }
}

我正在执行的实际操作与此示例并不特别相关。代码模式是。你会注意到我正在使用嵌套的“紧”循环。在所有计算完成之后,控制永远不会返回到运行循环。如果没有ARC,一旦执行了最后release,您的内存将被释放,不包括自动释放的对象。使用ARC,在将控制权返回到runloop之前,不会释放内存,这与自动释放的对象相同。结果,您的代码似乎会泄漏,直到处理完成并且系统决定它应该释放您的内存。如果CPU永远处于高负载状态,它可能无法清理内存,直到它绝对必须。

在这种情况下,有一些切割方法可以使用@autoreleasepool来帮助,但这会使代码显着变慢。另外,Objective C对于对象和方法调用来说是一种相当慢的语言。如果您大量使用此代码,则应将其转换为C或C ++并自行管理内存。

答案 1 :(得分:0)

没有详细说明你可以尝试使用autoreleasepool

https://developer.apple.com/library/mac/documentation/cocoa/conceptual/memorymgmt/articles/mmAutoreleasePools.html

我会使用copy如果我想保留一个被修改的数组,但在你的情况下你真的需要吗?