创建一个ARC新项目并在didFinishLaunchingWithOptions中注入此代码。
for (int i=0; i < 1000000; i++) {
NSNumber* num = [NSNumber numberWithInt:i];
NSLog(@"%@", num);
}
NSLog(@"over");
应用程序的内存会增加。 此外,在for循环结束时,内存不会减少。
但是,如果你替换相同的for循环:
NSNumber* num = [NSNumber numberWithInt:i];
通过
NSNumber* num = [[NSNumber alloc] initWithInt:i];
然后记忆力将保持稳定。
这是预期的行为吗?
修改
好的,我们暂时将didFinishLaunchingWithOptions放在一边。 您仍然可以放入viewDidLoad并删除零,以便更快地到达for循环的结尾 应用程序的内存将增长到~11 MB。当for循环结束时,内存不会减少。它仍然是~11 MB。
- (void)viewDidLoad {
[super viewDidLoad];
for (int i=0; i < 100000; i++) {
NSNumber* num = [NSNumber numberWithInt:i];
NSLog(@"%@", num);
}
NSLog(@"over");
}
如果你选择:
- (void)viewDidLoad {
[super viewDidLoad];
@autoreleasepool {
for (int i=0; i < 100000; i++) {
NSNumber* num = [NSNumber numberWithInt:i];
NSLog(@"%@", num);
}
}
NSLog(@"over");
}
惊喜!惊喜! 你会有完全相同的行为。你将达到~11 MB,内存不会减少。但是,将@autorelease放在循环中会起作用......但是在这里,我并不是想让事情有效但是要理解为什么在for循环结束时内存不会耗尽。
所以,问题仍然存在。
答案 0 :(得分:3)
这是预期的。当您使用alloc / init分配NSNumber
时,ARC将在不再需要时立即释放它。
当您使用numberWithInt:
等便捷方法分配它时,您将获得的是在自动释放池中分配的对象。在自动释放池耗尽之前,您的内存将不会被释放。但是,您可以像这样为循环创建自动释放池:
for (int i=0; i < 1000000; i++) @autoreleasepool {
NSNumber* num = [NSNumber numberWithInt:i];
NSLog(@"%@", num);
}
NSLog(@"over");
这应该在每次外观迭代后释放数字。
您可以在此处获取更多详细信息: Memory Management Policy