NSKeyedArchiver archivedDataWithRootObject:不释放内存使用量

时间:2017-02-16 13:02:08

标签: ios objective-c memory automatic-ref-counting

这样的代码:

NSMutableData *data = [NSMutableData dataWithLength:10*1024*1024];
for (int i = 0; i < 10; i++) {
    NSData* archiveData = [NSKeyedArchiver archivedDataWithRootObject:data];
    NSLog(@"%lu", (unsigned long)[archiveData length]);
}

在for循环中设置断点,它将看到内存使用量将增加为:10MB - &gt; 20MB ....-> 100MB,当离开for循环时,它仍然没有释放内存。

只有当我继续这个过程(可能会进入下一个主循环)时,内存使用量将减少100MB。

PS:打开ARC /关闭ARC并使用关键字释放也是一样的结果。

1 个答案:

答案 0 :(得分:2)

你在这里看到的是NSAutoreleasePool在工作。只需将循环更改为:

for (int i = 0; i < 10; i++) {
    @autoreleasepool {  // new autorelase pool
        NSData* archiveData = [NSKeyedArchiver archivedDataWithRootObject:data];
        NSLog(@"%lu", (unsigned long)[archiveData length]);
    } // drain autorelease pool
}

这将导致运行时间变慢,但应极大地减少内存影响。

所有便捷构造函数(类似于[MyClass myClassWithSomething]的名称)将始终返回驻留在自动释放池中的对象(因为这是与手动保留/释放代码的合同)。

&#34;默认&#34;自动释放池通常驻留在当前NSRunLoop中,并将在每个事件处理周期后释放。如果在一个周期内创建了太多对象,则池将会增长和增长。因此,您可以手动创建内部自动释放池,然后更频繁地将其耗尽。