【问题标题】:Does Foundation use Core Foundation?Foundation 使用 Core Foundation 吗?
【发布时间】:2018-02-18 18:02:24
【问题描述】:

在我看来,它不像。当然我没有Foundation的来源,但是如果是GNUStep,就举这个例子吧。

他们有这样的 NSArray 代码 https://github.com/gnustep/libs-base/blob/master/Source/NSArray.m

在源代码中没有任何地方引用 CFArray。

https://github.com/gnustep/libs-corebase/blob/master/Source/CFArray.c

所有 CF 对应物也一样。 为什么?

【问题讨论】:

  • 你是说 GNUstep 吗?您已链接到 GNUstep。

标签: cocoa foundation core-foundation gnustep


【解决方案1】:

GNUStep 与 Apple 的 Foundation 不同。我不太了解 GNUStep 是如何实现的,但在 Apple 的基金会中,NS 和 CF 对应物确实非常紧密地联系在一起。正如你所说,我们没有 Foundation 的源代码,但是仍然有很多方法可以检测两者之间的集成。一个非常容易发现的方法就是检查许多 Foundation 对象的类:

NSMutableString *string = @"Foo".mutableCopy;
NSLog(@"%@", NSStringFromClass(string.class));

这个小程序输出__NSCFString,暗示CFString 的实现确实在幕后使用。具体来说,NSStringCFString(以及 NSArrayCFArrayNSDictionaryCFDictionary,以及许多其他 Foundation 和 CF 类型)是免费桥接-这意味着它们的内部结构设计为完全相同,因此您实际上可以通过简单的类型转换将一个转换为另一个,而无需昂贵的转换过程。所以NSArray 不只是使用 CFArray,它实际上一个CFArray

当然,由于允许创建您自己的私有子类,例如 NSStringNSArray 等,这意味着要使桥接工作,CF 函数需要能够处理这种情况看起来像 CF 对象的地方实际上是 Objective-C 的子类,如果是,请使用 Objective-C 实现。出于这个原因,我们确实拥有很多来源的 CoreFoundation 对象实际上确实对它们的 NS 等效项进行了许多引用,例如下面链接的 CFArray 源,其中包含对 @ 的引用987654337@.

https://opensource.apple.com/source/CF/CF-1153.18/CFArray.c.auto.html

【讨论】:

  • NSArray 的引用在CF_OBJC_FUNCDISPATCHVCF_OBJC_FUNCDISPATCHV 是做什么的?
  • @Willeke 好吧,实际 Apple 框架中的版本源不可用(有一个“精简”版本用于在 Linux 和其他平台上构建,其中 Objective-C 集成并不重要将粘合宏定义为无操作,但我们没有“真实”宏的来源),因此不可能 100% 肯定地说。但是,他们可能会检查对象是否是自定义 Objective-C 子类,如果是则调用 Objective-C 方法并提前返回,如果不是则继续正常实现,这似乎是一个不错的猜测。
【解决方案2】:

GNUstep 的 Foundation 类不使用 Core Foundation。 GNUstep 最初是OpenStep specificiation 的免费、开源实现。 Foundation 和 AppKit 类都派生自 OpenStep 规范。虽然 GNUstep 的目标是赶上 Cocoa 的当前版本(根据 GNUstep 的 Wiki,它承诺与 Mac OS X Tiger 兼容,并且新版本 macOS 的一些类和方法已添加到 GNUstep),我的理解是 GNUstep 没有任何核心基础依赖项。我发现了一个有趣的2005 mailing list post 讨论为什么 GNUstep 不使用 Core Foundation。

当 Apple 在 1998 年宣布其 Mac OS X 战略时,它为开发人员提供了两个 API:Cocoa,它是 Foundation 和 AppKit 库的更新版本,以及 Carbon,它是从经典 Macintosh Toolbox 派生的 C API更新为适用于具有抢占式多任务和受保护内存的操作系统。 Carbon 和 Cocoa 都建立在 Core Foundation 之上,它为这两个 API 提供了一个通用的桥梁。 Carbon 和 Cocoa 在 Mac OS X 中是同等级别的,两者的 API 都没有哪一个更受青睐。

因此,简而言之,Core Foundation 被添加到 Mac OS X 中,作为 Cocoa 和 Carbon 之间的兼容性桥梁。但是 GNUstep 本质上是现代的 OpenStep,而 OpenStep 从来没有 Core Foundation,因此 GNUstep 的 Foundation 没有使用 Core Foundation。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多