在ARC托管代码中使用__attribute __

Ita*_*ber 2 cocoa objective-c automatic-ref-counting

当ARC来到Objective-C时,我尽力阅读Clang项目网站上发布的Objective-C自动参考计数(ARC)指南,以更好地了解它的内容.我在那里发现的(并没有其他地方)提到使用__attribute__声明来表示ARC是否某些代码自动释放其返回值,例如(__attribute__((ns_returns_autoreleased))),或者它是否"消耗"一个参数(__attribute((ns_consumed))等等).

但是,该指南似乎很少说明这些声明所持有的实际必要程度.在运行静态分析器和运行项目本身时,排除它们似乎没有任何区别.这些甚至有所作为吗?用方法标记方法有什么好处__attribute__((objc_method_family(new)))吗?我在ARC上找到的文章都没有提到这些说明者; 也许ARC大师可以说出这些用途.

(就个人而言,我包括所有相关的说明符以防万一,但发现他们使代码混淆和混乱.)

Pet*_*sey 5

这些属性明确适用于异常情况,例如:

可保留对象指针类型的函数或方法参数可以被标记为已消耗,表示被调用者期望获得+1保留计数的所有权.

返回可保留对象指针类型的函数或方法可以被标记为返回保留值,表示调用者期望获得+1保留计数的所有权.

您通常不会执行这些操作,因此通常不会使用这些属性.没有属性,正常行为--NARC规则,或者可能在ARC下我应该说CAN-是编译器实现和期望的.

使用这些属性有两个原因:

  • 为了违反CAN规则; 也就是说,要有一个不是这样命名的方法来返回一个引用,或者这样命名的方法不返回引用.该属性记录了方法原型中的违规,如果实现使用ARC,甚至可能需要实现它.
  • 使用Core Foundation类型,包括Core Graphics类型.这些不是ARCed,因此您需要使用桥接属性来帮助转换为"可保留对象指针"类型.