RequestDeviceConfigurationChange传递OSObject的所有权及release时机问询
问题解答
1. 何时调用release()?
你当前第一个代码块的写法是正确的:无论RequestDeviceConfigurationChange返回成功还是失败,都需要在调用代码中对newOSBufferSize调用release()。
因为OSNumber::withNumber返回的对象引用计数初始为1,你作为创建者拥有这个对象的所有权,必须负责释放它,除非有明确的API文档说明该函数会接管对象所有权(即调用retain)。Xcode的泄漏提示也验证了这一点——如果不调用release(),对象会一直存在导致内存泄漏。
2. RequestDeviceConfigurationChange的行为
它不会保留传入的OSObject,也不会在PerformDeviceConfigurationChange执行完毕后自动释放该对象。
理由有两点:
- 若它保留了对象,你在调用成功后就无需手动
release()(所有权已转移),但Xcode明确提示不调用会泄漏,说明你仍需承担释放责任; - 在
PerformDeviceConfigurationChange中,Xcode提示调用release()会错误减少未拥有对象的引用计数,说明该函数从未调用过retain获取对象所有权,自然也不会负责释放它。
内容的提问来源于stack exchange,提问作者tuple_cat
相关产品推荐
相关产品推荐

