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