我正在尝试在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
未被释放?
答案 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
我会使用copy如果我想保留一个被修改的数组,但在你的情况下你真的需要吗?