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

Ben*_*ron 7 cocoa macos-carbon objective-c core-foundation

我一直想知道为什么Apple在Core Foundation中使用了类型为指针类型的数据类型,而在Cocoa中却没有.

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

或者例如,它为什么id而不是id *,因为它实际上是一个指针,实际上可以强制转换为void *

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

bbu*_*bum 8

马特说,但还有一点.

基于C的API中的typedef还允许隐藏实现细节.例如,您可以在没有在公共标头中定义__CFURL结构的情况下使用以下内容.

typedef __CFURL *CFURLRef;
Run Code Online (Sandbox Code Playgroud)

Objective-C长期以类别的形式具有这些类型的功能,并且最近添加了将实例变量声明移出头文件的能力.期望随着时间的推移,您将看到从SDK中的公共头文件中删除所有实例变量.

请注意,Cocoa框架是长期的,早期的CoreFoundation.

至于为何id使用而不是id *,那可以追溯到1980年代早期首次创建Objective-C时.具体来说,语言的概念是你将构建"软件集成电路",可以像真正的IC一样"插在一起".目标是将C位保持为实现细节,理想情况下,不会在API中公开.

至于为什么你最终会NSString *取而代之NSString,这主要是因为语言的C基础.我写了一个相当详细的答案来解决一个有点不同的SO问题.

你也可能也会发现这个答案也是相关的.