【问题标题】:Why did Apple previously typedef reference (pointer) types but not now?为什么 Apple 以前 typedef 引用(指针)类型而不是现在?
【发布时间】:2012-04-02 23:00:35
【问题描述】:

我一直想知道为什么 Apple 在 Core Foundation 中使用类型定义为指针类型的数据类型,而在 Cocoa 中却不是。

例如,您将引用 UIColor 对象,例如 UIColor *,而对 CGColor 对象的引用将是 CGColorRef?还是NSURL *CFURLRef?为什么不总是使用CGColor *CFURL *?或者反过来说,为什么没有UIColorRefNSURLRef 类型,因为你从来没有直接访问过UIColorNSURL

或者例如,为什么它是id而不是id *,因为它实际上是一个指针并且实际上可以被类型转换为void *

具体来说,Apple 习惯在他们的旧框架中这样做,但在 Cocoa 中停止这样做,是否有某种原因?只是风格问题吗?

【问题讨论】:

  • Cocoa(作为 NeXTStep)实际上比 Core Foundation 更老。
  • 啊,我没有意识到这一点。我一直认为它是较新的。
  • 实际上,既然你提到了它,我确实意识到它是 NeXTStep 的一部分,我想我是在考虑更新为 Apple 框架的一部分。

标签: objective-c cocoa macos-carbon core-foundation


【解决方案1】:

Matt 说了什么,但还有更多内容。

基于 C 的 API 中的 typedef 还允许隐藏实现细节。例如,您可以拥有以下内容,而无需在公共标头中定义 __CFURL 结构。

typedef __CFURL *CFURLRef;

Objective-C 长期以来一直以类别的形式提供这些类型的功能,并且最近添加了将实例变量声明移出头文件的能力。预计随着时间的推移,您会看到从 SDK 的公共头文件中删除的所有实例变量。

请注意,Cocoa 框架很长,很早,早于 CoreFoundation。

至于为什么使用id 而不是id *,这要追溯到1980 年代初Objective-C 最初创建的时候。具体来说,该语言的概念是您将构建“软件集成电路”,可以像真正的 IC 一样“插入”在一起。目标是保留 C 位作为实现细节,理想情况下,不暴露在您的 API 中。

至于为什么你最终得到NSString * 而不是NSString,这很大程度上是因为该语言的C 基础。我写了一个fairly detailed answer 到一个稍微不同的相关问题。

您可能还会找到this answer relevant

【讨论】:

  • 啊不错@bbum :-)。我什至会在回答中说“但请等待@bbum 发言”!我什至试图找到一个我发誓你之前写过的关于idid* 的答案,但完全失败了。不过这里的答案很好。
【解决方案2】:

NSURL* vs CFURLRef 的原因很可能只是编码风格。 Cocoa 是一个 Objective-C API,Objective-C 的一般风格是没有 typedef,而 Core Foundation 是一个 C API,它的一般风格是使用 typedef。这很大程度上取决于编码风格。

id vs id* - 我对此并不完全确定,但我的猜测是这是历史性的,他们只是想让基本“对象”没有*。不过,我不确定这件事的历史。但同样,它只是一种风格。

【讨论】:

    猜你喜欢
    • 2010-10-13
    • 2013-02-09
    • 1970-01-01
    • 2016-11-08
    • 2017-02-25
    • 2023-01-20
    • 1970-01-01
    • 2012-01-01
    相关资源
    最近更新 更多