【问题标题】:What does it mean to share an implementation?共享实现意味着什么?
【发布时间】:2013-04-02 12:56:42
【问题描述】:

正如标题所述,我希望了解共享实现意味着什么。更具体地说,我想知道它如何工作。我明白这些词的意思,但我不清楚它是如何工作的。

例如。 “快速枚举实现在 Objective-C 运行时和 Foundation 框架之间共享。”

这是来自 Apple 的 Cocoa Fundamentals 文档。我正在阅读并遇到这条线,并试图了解这个过程。

谢谢

【问题讨论】:

  • 这可能意味着它在Objective-C运行时,Foundation库中,甚至可能在Objective-C编译器中实现......

标签: objective-c cocoa implementation shared


【解决方案1】:

这基本上涵盖了一种有些矛盾的编程模式(在我看来,这是错误的):Objective-C 语言、libobjc 运行时库和 Foundation 框架没有严格分开。例如,一些基本消息名称,如retain、release 等,被硬编码到 Objective-C 运行时库中(例如,为了 ARC 将这些识别为特殊的内存管理相关消息),以及快速枚举也是如此。

countByEnumeratingWithState:objects:count: 选择器被编译器识别,并在遇到for (object in collection) 语法时发出。然后集合对象,其中类实现了协议NSFastEnumeration 的这个硬连线消息,根据运行时库和ABI 期望的方式更新count、objects、它的返回值等。

由于历史原因,这三件事(语言/编译器、运行时库和 Foundation 框架)之间存在如此紧密的耦合,以至于这种硬编码方法是可用且现实的,但它也是一个 可怕的违反了语言和库的分离。我什至敢说这是一个相当肮脏的hack。

【讨论】:

  • 我不确定它是不是这样一个 ugly hack(它是一个 dirty hack,而不是真正丑陋的)。避免这种 hack 的唯一方法是(像 Lisp、Smalltalk 那样......)让运行时、基础和编译器成为一个单一的产品和程序。你真的想要吗?
  • @BasileStarynkevitch 我的母语不是英语,请原谅。我刚刚根据您的评论更新了术语。
  • @BasileStarynkevitch 至于解决方案:不,您提出的并不是唯一的解决方案。如果有: 1. 编译器开关来指定内存管理和快速枚举选择器名称、对象文字类(有一个用于字符串文字,-fconstant-string-class)等。和也可以告诉运行时使用一些设置函数这些是什么(或者更好的是,让编译器生成这些调用),这将是正确的解决方案。
  • 我的母语不是英语。
  • @BasileStarynkevitch 不管怎样,你的术语是对的。
猜你喜欢
  • 2012-07-14
  • 2015-01-04
  • 2023-03-10
  • 1970-01-01
  • 2014-12-26
  • 2020-06-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-30
相关资源
最近更新 更多