这段代码有什么问题,如何修改?
for (int i = 0; i < someLargeNumber; i++) {
NSString *string = @”Abc”;
string = [string lowercaseString];
string = [string stringByAppendingString:@"xyz"];
NSLog(@“%@”, string);
}
这里,我们暂定someLargeNumber = 10W.
这段代码在ARC中是没有问题的,在MRC中,才有问题.问题也很显然,创建的字符串对象并没有释放.
字符串对象是比较特殊的对象,release,或者autorelease并不能有效释放掉.在模拟器上重复10w次可以发现内存从21.6MB一直增长到40MB.
原始代码循环执行前 原始代码循环执行后可见,没有释放掉.
正确的修改方案如下:
for(int i = 0; i<100000;i++){
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSString *string = @"Abc";
string = [string lowercaseString];
string = [string stringByAppendingString:@"xyz"];
NSLog(@"%@",string);
[pool drain];
}
修改代码执行循环后可见,对于MRC下字符串的正确释放,用NSAutoreleasePool是一个解决方案.
网友评论