Mar*_*rty 1 memory-management objective-c 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
}
Run Code Online (Sandbox Code Playgroud)
如果我更换:
[subArray addObject:[NSArray arrayWithObjects:@"test", @"test", nil]];
Run Code Online (Sandbox Code Playgroud)
有:
[subArray addObject:@"test"];
Run Code Online (Sandbox Code Playgroud)
它工作正常.所以我想我不得不释放我创建的数组.但是怎么样?我启用了ARC,据我所知,如果启用了ARC,我无法手动释放对象.如果有人可以帮我改变代码或者提示我可以学习如何正确地进行内存管理,那将会很棒.
谢谢
只需输入一些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];
}
Run Code Online (Sandbox Code Playgroud)
[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];
Run Code Online (Sandbox Code Playgroud)
因为您使用的是ARC,所以应该删除该版本.