我有一个应用程序,难以在iPad上运行的iOS 5上运行良好1.它经常与LowMemory警告崩溃。
该应用程序庞大,复杂(..convoluted),使用核心数据,....
我想尝试减少峰值内存占用。我到处都有自动释放的物品可以转换,但这可能会让我永远。
将项目转换为ARC会自动将这些自动释放的对象转换为在使用ARC编译时保留/释放.....并可能减少我的峰值内存占用量吗?
由于
答案 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
}
}
因此,临时工作会立即得到清理,降低峰值。