我是iOS / Objective-C的新手,我不理解正确释放内存.
为了测试它,我创建了一个空的启用ARC的iPhone-Project并创建了一个非常简单的测试类:
为了测试它,我创建了一个空的启用ARC的iPhone-Project并创建了一个非常简单的测试类:
#import "MemTest.h" @implementation MemTest { } -(void) start { for (int i = 0; i < 1500000; i++) { NSMutableString *myString = [NSMutableString string]; // The appended string is 2000 characters long in the real test class. [myString appendString:@"12345678901234567890123456 <very long>"]; if (i % 1000 == 0) { NSLog(@"i = %d",i); } myString = nil; } } @end
我只是在AppDelegate中开始测试:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { MemTest *test = [[MemTest alloc] init]; [test start]; .... }
应用程序(正如预期的那样)打印许多不错的数字“i = xy”,但内存使用量随着每次迭代而增加,最后应用程序崩溃:
.... 2012-12-06 20:17:40.193 MemTestApp[19250:11303] i = 930000 2012-12-06 20:17:40.208 MemTestApp[19250:11303] i = 931000 MemTestApp(19250,0xac63f2c0) malloc: *** mmap(size=16777216) Failed (error code=12) *** error: can't allocate region *** set a breakpoint in malloc_error_break to debug
所以我的问题是:为什么内存使用量会增长?
我认为通过分配nil,应该在使用ARC时释放内存.我在这里想念的是什么?
解决方法
有些事情可能会出错:
>您可能实际上没有启用ARC.你应该仔细检查一下.最简单的方法是在代码中引入-retain并确保抛出编译器错误.
> ARC不一定会阻止对象进入自动释放池.它试图抓住它,如果它可以,但它不能保证.值得注意的是,在-O0(无优化)时,它经常不会阻止对象进入自动释放池.这很可能是你发生的事情.
>即使在更高的优化级别,仍然不能保证启用ARC的代码能够捕获自动释放.
如果你在for循环中粘贴@autoreleasepool {},你会发现内存使用量应该消失.或者,不是使用[NSMutableString string],而是可以尝试[NSMutableString new],它根本不使用自动释放池*,但在ARC代码中应该具有相同的行为.
*嗯,如果需要,NSMutableString可以在内部自由使用自动释放池