我的任务是采用Modern Objective-C,我在Xcode中使用重构工具:编辑>重构>转换为现代Objective-C语法。
在项目中,我有一个方法返回const void *
类型。并且在重构工具之后,在此方法之后自动添加NS_RETURNS_INNER_POINTER
标志。我确实在FoundationOlderNotes检查了这个标志,但对我来说并不清楚。
NS_RETURNS_INNER_POINTER
?答案 0 :(得分:3)
NS_RETURNS_INNER_POINTER
是objc_returns_inner_pointer
方法属性的特定于Cocoa的等价物。文档为here:
返回不可保留指针的Objective-C方法可能是 使用
objc_returns_inner_pointer
属性进行注释以指示 它返回一个对象内部数据的句柄,那个 如果对象被销毁,则此引用将失效。什么时候 这样的消息被发送到一个对象,该对象的生命周期将是 延长至至少最早:
- 在调用函数或
中最后一次使用返回的指针或从中派生的任何指针- 自动释放池将恢复到之前的状态。
原理
基本原理:并非所有内存和资源都通过引用计数进行管理;对象通常以自己的私有方式管理私有资源。通常,这些资源完全封装在对象中,但某些类为其用户提供了直接访问以提高效率。如果ARC不知道返回此类“内部”指针的方法,则其优化可能会导致拥有对象过早被回收。这个属性告诉ARC它必须轻视。
扩展规则有点模糊不清。自动释放池限制允许简单的实现以简单地保留和自动释放接收器。另一个限制允许一些优化。短语“派生自”旨在包含指针变换的结果,例如强制转换和算术,以及从这些派生指针加载的结果;此外,它适用于此类派生是否直接应用于调用代码或其他实用程序代码(例如,C库例程
strchr
)。但是,从调用返回内部指针的方法的代码返回后,实现永远不需要考虑使用。作为例外,如果直接从
__strong
对象precise lifetime semantics加载接收器,则不需要扩展。原理
隐式自动释放存在显着增加内存使用的风险,因此为用户提供避免这些自动释放的方法非常重要。将此与精确的生命周期语义联系起来是理想的,因为局部变量需要非常明确的注释,这允许ARC以良好的欢呼信任用户。
回答您的具体问题:
NS_RETURNS_INNER_POINTER
进行注释。它应该只有在它返回"内部"或"内部"指针。也就是说,如果对象本身被释放,则该指针将变为无效。