这样的代码:
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并使用关键字释放也是一样的结果。
答案 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
中,并将在每个事件处理周期后释放。如果在一个周期内创建了太多对象,则池将会增长和增长。因此,您可以手动创建内部自动释放池,然后更频繁地将其耗尽。