对我来说似乎不是这样的。当然,我没有基金会的源码,但如果是GNUStep,请看下面这个例子。
他们有一个像这样的https://github.com/gnustep/libs-base/blob/master/Source/NSArray.m的NSArray代码
在源代码中,他们没有提到CFArray。
https://github.com/gnustep/libs-corebase/blob/master/Source/CFArray.c
所有CF对应物也是如此。为什么?
发布于 2019-06-23 17:21:44
GNUstep的基础类不使用核心基础。GNUstep最初是OpenStep specificiation的一个免费、开源的实现。基础类和AppKit类都是从OpenStep规范派生的。虽然GNUstep的目标是赶上当前版本的Cocoa (根据GNUstep的Wiki,它保证了与macOS的兼容性,并且一些较新版本的macOS的类和方法已经添加到GNUstep中),但我的理解是GNUstep没有任何核心基础依赖项。我发现了一个有趣的2005 mailing list post,它讨论了为什么GNUstep不使用核心基础。
当苹果在1998年宣布其Mac战略时,它为开发人员提供了两个API: Cocoa和Carbon,Cocoa是基金会和AppKit库的更新版本,Carbon是从经典Macintosh工具箱派生的APIs,经过更新后适用于具有抢占式多任务和受保护内存的操作系统。Carbon和Cocoa都构建在Core Foundation之上,Core Foundation为这两个API提供了一个公共桥梁。Carbon和Cocoa在Mac中是对等的,两个API都不受欢迎。
因此,简而言之,Core Foundation被添加到Mac OS X中,作为Cocoa和Carbon之间的兼容性桥梁。但GNUstep本质上是现代的OpenStep,而OpenStep从来没有核心基础,因此GNUstep的基础不使用核心基础。
发布于 2017-09-11 00:01:51
GNUStep并不等同于苹果的基金会。我不太了解GNUStep是如何实现的,但在苹果的基金会中,NS和CF的对应物确实联系得非常紧密。正如您所说,我们没有Foundation的源代码,但仍有许多方法可以检测两者之间的集成。一个非常容易发现的方法就是检查许多Foundation对象的类:
NSMutableString *string = @"Foo".mutableCopy;
NSLog(@"%@", NSStringFromClass(string.class));这个小程序输出__NSCFString,这表明CFString的实现确实在幕后使用。具体地说,NSString和CFString (以及NSArray和CFArray,NSDictionary和CFDictionary,以及许多其他基础和CF类型)是免费桥接的-这意味着它们的内部结构被设计为完全相同,因此您可以通过简单的类型转换将它们转换为另一个,而不需要昂贵的转换过程。因此,NSArray不仅仅使用<代码>D10,它实际上是一个<代码>D11。
当然,由于允许创建自己的NSString、NSArray等类的私有子类,这意味着要使桥接起作用,CF函数需要能够处理CF对象实际上是Objective-C子类的情况,如果是,则使用Objective-C实现。出于这个原因,我们有很多源的CoreFoundation对象实际上引用了许多NS等效项,例如下面链接的CFArray源,其中包含对NSArray的引用。
https://opensource.apple.com/source/CF/CF-1153.18/CFArray.c.auto.html
https://stackoverflow.com/questions/46139713
复制相似问题