为什么NSNumber * test = [NSNumber numberWithInt:i]不会在for循环中添加内存占用量?

时间:2015-08-19 14:48:37

标签: ios objective-c memory

我正在尝试重现for循环中的巨大内存占用。例如,在下面的for循环中,如果其中没有自动释放池。它将导致峰值内存占用。

for(int i=0; i< 500000; i++){
    NSNumber *test = [NSNumber numberWithInt:i];
}

因为表达式[NSNumber numberWithInt:i]返回一个autorelease对象,并且如果for循环中没有自动释放,所有自动释放的对象将被释放一次,这将导致峰值内存占用。
但是当我在Xcode6中测试时,这个结果没有被复制。我使用此totalSize += malloc_size((__bridge const void *) test);来计算所有对象的总大小,但我得到totalSize = 0结果 我可以使用像[NSString stringWithFormat:@"%d ", i];这样的代码重现巨大的内存占用 有人可以提前解释这个问题。

2 个答案:

答案 0 :(得分:4)

NSNumber s(适合60位的那些)存储为标记指针。它是带有数值的实际64位指针值,因此没有堆分配。这是Obj-C运行时透明地完成的。 有关此主题的更多信息:https://mikeash.com/pyblog/friday-qa-2012-07-27-lets-build-tagged-pointers.html

NSString也被存储为标记指针。请参阅Mike Ash关于标记指针字符串的优秀文章:https://mikeash.com/pyblog/friday-qa-2015-07-31-tagged-pointer-strings.html

答案 1 :(得分:2)

在您粘贴的for循环中,test变量已创建并立即销毁 它属于for的范围,因为没有其他东西从外部引用它,它将在循环结束时由ARC自动释放。
这就是为什么你的内存不会长大的原因。