ARC会降低我的峰值内存占用量吗?

时间:2012-02-01 11:59:28

标签: objective-c ios ipad automatic-ref-counting

我有一个应用程序,难以在iPad上运行的iOS 5上运行良好1.它经常与LowMemory警告崩溃。

该应用程序庞大,复杂(..convoluted),使用核心数据,....

我想尝试减少峰值内存占用。我到处都有自动释放的物品可以转换,但这可能会让我永远。

将项目转换为ARC会自动将这些自动释放的对象转换为在使用ARC编译时保留/释放.....并可能减少我的峰值内存占用量吗?

由于

3 个答案:

答案 0 :(得分:1)

嗯..我认为它肯定会降低你的足迹,但效果不会太戏剧化。内存占用的内容更多地取决于代码的设计,创建对象的方式以及一次又一次地使用同一个对象的效率。任何其他人的想法......?

答案 1 :(得分:1)

ARC可能有所帮助,也可能没有。这取决于没有它你管理内存的程度。我猜想,你做的其他设计决定应该重新考虑 - 修复这些决定会更进一步实现你的目标。

答案 2 :(得分:1)

ARC会降低峰值内存占用量,但通常只是略有下降。例外情况是,如果你在同一个runloop循环中做了很多自动释放的工作,或者你有一个线程,你只有一个你永远不会消耗的自动释放池。

考虑:

- (void)myBackgroundThread
{
    NSAutoreleasePool *pool;

    pool = [[NSAutoreleasePool alloc] init];

    for (int i = 0; i < 1000000; i++) {
        NSString *dummy = [NSString stringWithFormat:@"%d", i];
        NSLog(@"%@", dummy);
    }

    [pool release];
}

这将生成至少一百万个自动释放的字符串对象(NSLog可能会生成更多,我不知道)。它们都会累加,直到循环完成并释放池。

然而,使用ARC,它看起来像这样:

- (void)myBackgroundThread
{
    for (int i = 0; i < 1000000; i++) {
        NSString *dummy = [[NSString alloc] initWithFormat:@"%d", i];
        NSLog(@"%@", dummy);
        // The compiler inserts "objc_release(dummy);" here
    }
}

因此,临时工作会立即得到清理,降低峰值。