我编写了一些Objective-C
似乎工作正常的应用程序,除了不断增长的内存占用。我在 Xcode 4.6.2 的最后一个版本下使用 ARC。我的系统是 10.7.5。
我很Objective-C
陌生,需要一些帮助来弄清楚我的记忆发生了什么。我已经缩小了问题的范围,以解释为什么以下基本代码的行为如此。
此代码添加到 Xcode 提供的基于 Cocoa 的普通应用程序模板中(启用了 ARC)。
案例A
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification{
NSDate* d;
for(int i=0; i<1000000; i++){
d = [[NSDate alloc] init];
}
}
一切都按预期进行,ARC 即时回收内存。即,内存使用历史非常平坦。当 for 循环结束时,应用程序占用大约 25MB 内存。
案例B
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification{
NSDate* d;
for(int i=0; i<1000000; i++){
d = [NSDate date];
}
}
这里的事情对我来说真的很神秘。仅在运行应用程序时,(实际)内存使用量不断增加到大约 53MB,然后永远保持在那里。
但是,在运行分配分析器工具时,我可以看到在 for 循环结束时,所有对象都被释放,这与您对自动释放池的期望非常相似。此外,用 @autoreleasepool{} 封闭 for 循环的主体会使案例 B 的行为类似于案例 A(如预期的那样)。
所以,三个问题:
[NSDate date]
在 ARC 下,使用“autoreleased”和 alloc init 对象有什么区别?(我认为这里的其他问题几乎没有。)- 为什么运行代码时 ARC 似乎没有启动?
- 为什么分析的应用程序和实际应用程序的内存行为存在差异?