小编aka*_*ant的帖子

使用[NSDate date]时为什么ARC不释放内存,但使用[[NSDate alloc] init]工作正常?

我写了一些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(如预期的那样).

那么,三个问题:

  1. 在ARC下,使用"autoreleased" [NSDate date]和alloc init对象有什么区别?(我认为这里的其他问题几乎没有.)
  2. 为什么ARC在运行代码时似乎没有启动?
  3. 为什么配置文件应用程序和实际应用程序的内存行为有所不同?

objective-c automatic-ref-counting

8
推荐指数
1
解决办法
1171
查看次数