我有一个应用程序在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
}
}
因此,临时仓库立即被清理,降低了峰值。