问题
为什么obj调用retain之后不会被释放,我看源码是每帧都会执行 AutoreleasePool->Clear(),接着就是for循环,每个obj->release(),每帧都release为什么不会被释放?
https://forum.cocos.org/t/topic/113072
答案
- Node创建并加入自动释放池 rc=1
- retain后rc+1=2
- 下一帧:
- 清空自动释放池,rc-1=1,rc>0并不会被立即释放
- 自动释放池会被清空,所有池中节点执行release
- 每个节点加入自动释放池后,在下一帧就会被从池中移除了
- 每一帧都清除自动释放池,但是节点在池中只会存在一帧
- retain对象需要手动release才释放
自动管理的节点
- 比如addChild的rc+1=2
- 从池中被剔除时rc=1也不会被释放
- 场景退出时,会析构释放子节点容器,
- 每个子节点会被调用release
- 从而释放整个场景节点树
可以研究一下节点的生命周期
本文探讨了Objective-C中的内存管理,特别是retain和autorelease的使用。当对象被retain后,引用计数增加,不会立即释放。即使在每一帧的AutoreleasePool清理过程中,只要引用计数大于0,对象就不会被销毁。节点在加入自动释放池并在下一帧被释放时,其引用计数会减一,但只要不手动release,对象依然保持活跃状态。了解这些原理对于优化和避免内存泄漏至关重要。
191

被折叠的 条评论
为什么被折叠?



