NSNumber可能的内存泄漏

时间:2014-04-30 07:39:24

标签: xcode memory-leaks nsnumber

创建一个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循环结束时内存不会耗尽。

所以,问题仍然存在。

1 个答案:

答案 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