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



我有一个应用程序在iPad1上运行的iOS 5上很难表现良好。它经常在低内存警告下崩溃。

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

我想尝试减少峰值内存占用。到处都有自动释放的对象,我可以四处转换,但这可能会花我一辈子的时间。

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

感谢

hmm。。我认为这肯定会减少你的足迹,但效果不会太显著。内存占用更多地取决于代码的设计、创建对象的方式以及反复使用同一对象的有效性。。还有其他想法吗?

ARC可能会有所帮助,但可能不会。这取决于你在没有内存的情况下对内存的管理情况。不过,我想,你做出的其他设计决定也应该重新考虑——修复这些决定将大大有助于实现你的目标。

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

考虑:

- (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
    }
}

因此,临时仓库立即被清理,降低了峰值。

最新更新