You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何内存未增长?是否已分配物理内存?Xcode测试代码疑问

为什么循环创建NSObject不会触发OOM?

这问题挺典型的,我来给你拆解下背后的几个关键原因:

  • ARC自动回收了对象
    你写的代码里,NSObject *obj是循环内的局部变量。在ARC(自动引用计数)机制下,每次循环迭代结束时,这个变量的作用域就走完了,ARC会自动插入release操作,把对象的引用计数降到0,对象随即被销毁。相当于你每次创建的对象刚诞生就被回收了,内存自然不会累积增长。

  • 系统的惰性内存分配机制
    就算ARC没及时回收(比如手动关闭ARC测试),macOS/iOS的内存分配也采用惰性分配策略:alloc只是给对象分配了虚拟内存地址,但不会立刻分配物理内存,只有当你真正往这块内存里写入数据时,系统才会映射对应的物理页。而NSObject的实例本身非常小,仅仅包含一个isa指针,甚至如果对象没有被实际使用(比如只是创建它但没调用任何方法、没访问属性),编译器或运行时可能还会做进一步优化,连虚拟内存的实际映射都跳过了。

  • 运行时的小对象复用优化
    另外,Objective-C运行时本身对小对象的创建有优化,比如会维护一个空闲对象池,销毁的NSObject实例可能被回收到池里,下次alloc直接复用,而不是重新申请内存,这也会让内存占用看起来没变化。

总结一下:你的代码里对象被ARC及时回收了,就算没被回收,系统也可能因为惰性分配没真正分配物理内存,所以自然不会触发OOM。

内容的提问来源于stack exchange,提问作者Kylin.Zhang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:35:35