iOS面试题详解

MRC下字符串对象的管理

2017-05-09  本文已影响48人  BinaryBang

这段代码有什么问题,如何修改?

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是一个解决方案.

上一篇下一篇

猜你喜欢

热点阅读