gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 17:38:16 25 4
gpt4 key购买 nike

我试图在for循环中重现巨大的内存空间,例如,在如下所示的for循环中,如果其中没有自动释放池。这将导致峰值内存占用。

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

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

最佳答案

NSNumber(适合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

关于ios - 为什么NSNumber * test = [NSNumber numberWithInt:i]没有在for循环中添加内存占用量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32098816/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com