objective-c – Objective C / iOS:使用ARC释放内存(内存泄漏)

前端之家收集整理的这篇文章主要介绍了objective-c – Objective C / iOS:使用ARC释放内存(内存泄漏)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我是iOS / Objective-C的新手,我不理解正确释放内存.
为了测试它,我创建了一个空的启用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可以在内部自由使用自动释放池

猜你在找的C&C++相关文章