为什么Apple之前是typedef引用(指针)类型但现在不是?

时间:2012-03-17 20:46:08

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

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

作为一个例子,你会引用像UIColor *这样的UIColor对象,而对CGColor对象的引用是CGColorRef?还是NSURL *CFURLRef?为什么不总是使用CGColor *CFURL *?或者相反,为什么没有UIColorRefNSURLRef类型,因为您永远不会直接访问UIColorNSURL

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

具体来说,是否有一些原因让Apple习惯在旧版框架中执行此操作,但是在Cocoa中停止了这样做?这只是风格问题吗?

2 个答案:

答案 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* - 我对此并不完全确定,但我猜这是历史性的,他们只是希望基础“对象”没有*。不过,我不确定那段历史。但同样,它只是一种风格。