Foundation使用Core Foundation吗?

时间:2017-09-10 10:31:47

标签: cocoa foundation core-foundation gnustep

对我而言,它似乎并不像。当然我没有基金会的来源,但是在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同行。 为什么呢?

2 个答案:

答案 0 :(得分:1)

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

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

这个小程序输出__NSCFString,这是CFString实施确实在幕后使用的线索。具体而言,NSStringCFString(以及NSArrayCFArrayNSDictionaryCFDictionary以及许多其他基础和CF类型都是免费桥接 - 这意味着它们的内部结构设计完全相同,这样您可以通过简单的类型转换实际将一个转换为另一个,而无需昂贵的转换过程。因此NSArray并非使用 CFArray,实际上 CFArray

当然,由于它允许创建自己的私有子类,如NSStringNSArray等,这意味着为了使桥接工作,CF函数需要能够处理看起来像CF对象的实际上是Objective-C子类的情况,如果是,则使用Objective-C实现。由于这个原因,我们的CoreFoundation对象有很多源,实际上会对它们的NS等价物进行多次引用,例如下面链接的CFArray源,其中包含引用到NSArray

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

答案 1 :(得分:1)

GNUstep的Foundation类不使用Core Foundation。 GNUstep最初是OpenStep specificiation的免费开源实现。 Foundation和AppKit类均源自OpenStep规范。虽然GNUstep的目标是赶上当前版本的Cocoa(根据GNUstep的Wiki,它承诺与Mac OS X Tiger兼容,并且一些新版本的macOS的类和方法已添加到GNUstep中),但我的理解是GNUstep没有任何Core Foundation依赖项。我发现有趣的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的基础上构建的,Core Foundation为这两个API提供了通用的桥梁。 Carbon和Cocoa在Mac OS X中是同等的,两个API都不比另一个更受青睐。

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