Ben*_*ron 7 cocoa macos-carbon objective-c core-foundation
我一直想知道为什么Apple在Core Foundation中使用了类型为指针类型的数据类型,而在Cocoa中却没有.
作为一个例子,你会引用一个UIColor对象,就像UIColor *对CGColor对象的引用一样CGColorRef?还是NSURL *和CFURLRef?为什么不总是使用CGColor *和CFURL *?或者相反,为什么没有UIColorRef或NSURLRef类型,因为你从来没有访问UIColor或NSURL直接访问?
或者例如,它为什么id而不是id *,因为它实际上是一个指针,实际上可以强制转换为void *?
具体来说,是否有一些原因让Apple习惯在旧框架中执行此操作,但是在Cocoa中停止了这样做?这只是风格问题吗?
马特说,但还有一点.
基于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问题.
| 归档时间: |
|
| 查看次数: |
297 次 |
| 最近记录: |