我一直想知道为什么Apple在Core Foundation中使用的数据类型是指针类型的类型,而在Cocoa中则不是。
作为一个例子,你会引用像UIColor *
这样的UIColor对象,而对CGColor对象的引用是CGColorRef
?还是NSURL *
和CFURLRef
?为什么不总是使用CGColor *
和CFURL *
?或者相反,为什么没有UIColorRef
或NSURLRef
类型,因为您永远不会直接访问UIColor
或NSURL
?
或者例如,为什么它是id
而不是id *
,因为它实际上是一个指针,实际上可以对void *
进行类型转换?
具体来说,是否有一些原因让Apple习惯在旧版框架中执行此操作,但是在Cocoa中停止了这样做?这只是风格问题吗?
答案 0 :(得分:8)
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。
答案 1 :(得分:1)
NSURL*
vs CFURLRef
的原因几乎就是编码风格。 Cocoa是一个Objective-C API,Objective-C中的一般样式是没有typedef,而Core Foundation是一个C API,它的一般风格是使用typedef。这几乎取决于编码风格。
id
vs id*
- 我对此并不完全确定,但我猜这是历史性的,他们只是希望基础“对象”没有*
。不过,我不确定那段历史。但同样,它只是一种风格。