如何使用NS_RETURNS_INNER_POINTER标志

时间:2015-01-20 10:24:51

标签: ios objective-c xcode

我的任务是采用Modern Objective-C,我在Xcode中使用重构工具:编辑>重构>转换为现代Objective-C语法。

在项目中,我有一个方法返回const void *类型。并且在重构工具之后,在此方法之后自动添加NS_RETURNS_INNER_POINTER标志。我确实在FoundationOlderNotes检查了这个标志,但对我来说并不清楚。

  1. 是否有必要为返回非对象指针类型的任何方法或属性添加NS_RETURNS_INNER_POINTER
  2. 编译器在ARC中使用指针返回方法究竟做了什么?

1 个答案:

答案 0 :(得分:3)

NS_RETURNS_INNER_POINTERobjc_returns_inner_pointer方法属性的特定于Cocoa的等价物。文档为here

  

返回不可保留指针的Objective-C方法可能是   使用objc_returns_inner_pointer属性进行注释以指示   它返回一个对象内部数据的句柄,那个   如果对象被销毁,则此引用将失效。什么时候   这样的消息被发送到一个对象,该对象的生命周期将是   延长至至少最早:

     
      
  • 在调用函数或
  • 中最后一次使用返回的指针或从中派生的任何指针   
  • 自动释放池将恢复到之前的状态。
  •   
     
    

原理

         

基本原理:并非所有内存和资源都通过引用计数进行管理;对象通常以自己的私有方式管理私有资源。通常,这些资源完全封装在对象中,但某些类为其用户提供了直接访问以提高效率。如果ARC不知道返回此类“内部”指针的方法,则其优化可能会导致拥有对象过早被回收。这个属性告诉ARC它必须轻视。

         

扩展规则有点模糊不清。自动释放池限制允许简单的实现以简单地保留和自动释放接收器。另一个限制允许一些优化。短语“派生自”旨在包含指针变换的结果,例如强制转换和算术,以及从这些派生指针加载的结果;此外,它适用于此类派生是否直接应用于调用代码或其他实用程序代码(例如,C库例程strchr)。但是,从调用返回内部指针的方法的代码返回后,实现永远不需要考虑使用。

  
     

作为例外,如果直接从__strong对象precise lifetime semantics加载接收器,则不需要扩展。

     
    

原理

         

隐式自动释放存在显着增加内存使用的风险,因此为用户提供避免这些自动释放的方法非常重要。将此与精确的生命周期语义联系起来是理想的,因为局部变量需要非常明确的注释,这允许ARC以良好的欢呼信任用户。

  

回答您的具体问题:

  1. 不,返回非对象指针的每个方法或属性都没有必要使用NS_RETURNS_INNER_POINTER进行注释。它应该只有在它返回"内部"或"内部"指针。也就是说,如果对象本身被释放,则该指针将变为无效。
  2. 未指定编译器究竟做了什么。在一些实现中,它可以简单地保留并自动释放返回内部指针的对象。