2011-10-01 27 views
2

当ARC来到Objective-C的,我尽力通过Objective-C Automatic Reference Counting (ARC)引导张贴锵项目网站上阅读以获得更好的开窍究竟是什么了。我发现什么有(没有别的地方)用__attribute__声明,以表示电弧某些代码是否自动释放其返回值,例如(__attribute__((ns_returns_autoreleased))),还是“消耗”参数(__attribute((ns_consumed)),等等提。使用__attribute __的的在ARC-托管代码

然而,似乎指南提供了必要性,这些声明持有的实际水平非常小的字,扣除他们似乎没有什么区别,无论是运行时,静态分析,也不运行项目本身的时候。做这些,甚至使不同的是,用__attribute__((objc_method_family(new)))标记方法是否有优势?我在ARC上找到的文章根本没有提及这些说明符;也许一位ARC大师可以提供这些用法的用词。(就个人而言,我有以防万一所有相关的说明符,但发现他们使代码混淆和混乱。)

回答

3

这是没有必要在大多数的情况下,因为LLVM &锵知道ObjC命名约定。因此,如果您遵循Cocoa的标准命名约定,LLVM会自动采取相应的家族/返回内存策略。

即是说,如果您声明一个名为initWith...的方法,它会自动将其视为“init”系列方法,不需要指定__attribute__((objc_method_family(init))),Clang会自动检测它;相同的new家庭等

事实上,你只需要使用__attribute__说明符时,叮当不能猜测这种情况下,实际上很少发生(实际上我从来没有使用它),或者只有如果你不尊重命名约定:


报价Clang Language Extensions Documentation

在Objective-C的许多方法都可以通过选择确定的传统含义。为了静态分析的目的,能够将方法标记为具有特定常规含义的方法有时是有用的,尽管没有正确的选择器或者不具有其选择器将建议的常规含义。对于这些用例,我们提供了一个属性来具体描述方法所属的方法族。

所以,只要你尊重命名约定(你应该总是这样做),你不会有任何事情做。

5

这些属性是明确地为异常的情况下,如:

可保持对象指针类型的函数或方法参数可以被标记为消耗,表示被叫方期望采取1的所有权保留计数。

它返回一个可保持对象指针类型可被标记为返回一个保留值,表示呼叫者希望采取1的所有权保留计数的函数或方法。

您通常不会做这些事情,所以您通常不会使用这些属性。没有属性,正常的行为 - NARC规则,或者在ARC下我应该说CAN - 是编译器实现和期望的。

有使用这些属性两方面的原因:

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