【问题标题】:What is an Objective-C "class continuation"?什么是 Objective-C “类延续”?
【发布时间】:2012-04-24 16:03:23
【问题描述】:

我不太清楚我所看到的称为Objective-C “类延续”。这是/是这些吗……

  1. @implementation (.m) 文件中声明的 Ivar?
  2. 类类别的另一个名称? (不太可能,ASFAIK 类别不能有 Ivar,句号)
  3. 类扩展的另一个名称?
  4. 还有别的吗?

也就是说……

  1. 这种东西的范围、生命周期和使用案例是什么?
  2. 这是 ARC 特有的“功能”吗?
  3. 是否有特定的运行时或其他使用要求?
  4. 这也是创建@property 的合适位置吗?为什么这比 @interface 文件/声明更适合设置 ivars 或属性?
  5. 为什么人们会使用如此具体的术语来使讨论复杂化 - 这似乎不存在于任何官方文档中(我可以找到)?

有问题In Objective-C what is the difference between defining something (say a property) in the header file as opposed to the .m file? 讨论涉及到这个问题,但只是进一步混淆了这个问题——或者至少没有提供该术语的规范参考/定义……因此这个问题。

【问题讨论】:

  • 来自链接问题中的评论..“'匿名类别'的正确术语是'类延续'。它与类别不同,因为它可以包含其他字段。”或其他一些问题herehere
  • 引用实际上是对类扩展的非常糟糕的描述。

标签: objective-c class variables syntax automatic-ref-counting


【解决方案1】:

延续类是 Apple 所说的 class extension。我见过 clang 称它们为“延续类”,而 gcc 使用“类延续”。

用 clang 或 gcc 编译:

@interface Foo : NSObject
@property int a;
@end

@interface Foo()
@property float a;
@end

...你会因为有趣的名字而出错。

回答您的其余问题:

  1. 这种东西的范围、生命周期和使用案例是什么?

扩展用于声明类的私有接口。您还可以使用它来重新声明(优化)公共属性声明。

  1. 这是 ARC 特有的“功能”吗?

没有。

  1. 是否有特定的运行时或其他使用要求?

类扩展是一个编译时概念,不需要特殊的运行时。当然,它们确实需要支持它们的编译器(clang 和 gcc 在当前版本中都支持)。

  1. 这也是创建@property 的合适位置吗?为什么这比 @interface 文件/声明更适合设置 ivars 或属性?

是的。因为您可能希望拥有私有属性。

  1. 为什么人们会使用如此具体的术语来使讨论复杂化 - 这似乎不存在于任何官方文档中(我可以找到)?

嗯,你知道...如果全世界都说英语,我也更喜欢,但目前我很高兴我必须在学校学习英语。

【讨论】:

  • 在non-fragile abi(即32位)之前,扩展更多的是一个普通的类别,不能用于声明私有ivars...
  • 声明私有 ivars 当然取决于 Objective-C 2.0 的运行时,无论它们是在类扩展中声明还是在 @implementation 中声明。仅在 clang 中支持将它们放在类扩展中。类扩展的特性不受此影响。
  • 我发现将类扩展与类别进行比较没有帮助。虽然语法相似,但它们用于不同的目的,并具有其他编译时间和运行时间特征。
  • 好的,这并没有改变你不能在 32 位 mac 上的扩展中声明 ivar 的事实,clang 或 no clang。您也无法为属性综合支持 iVar...因为运行时不支持它。
  • 请提交一个错误以防止在编译器中滥用名称。请注意,“类扩展”在开发过程中被简称为“类延续”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-18
  • 2013-12-06
  • 1970-01-01
  • 1970-01-01
  • 2011-05-28
  • 2012-12-28
  • 1970-01-01
相关资源
最近更新 更多