Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 为什么苹果以前使用typedef引用(指针)类型,而不是现在?_Objective C_Cocoa_Macos Carbon_Core Foundation - Fatal编程技术网

Objective c 为什么苹果以前使用typedef引用(指针)类型,而不是现在?

Objective c 为什么苹果以前使用typedef引用(指针)类型,而不是现在?,objective-c,cocoa,macos-carbon,core-foundation,Objective C,Cocoa,Macos Carbon,Core Foundation,我一直想知道为什么苹果在核心基础上使用数据类型,这些类型是指针类型的Type,而在COCOA中则不是。 例如,您可以引用UIColor对象,如UIColor*,而对CGColor对象的引用是CGColorRef?或者NSURL*和CFURLRef?为什么不总是使用CGColor*和CFURL*?或者相反,既然您从未直接访问UIColor或NSURLRef类型,为什么没有UIColorRef或NSURL类型 或者,例如,为什么它是id而不是id*,因为它实际上是一个指针,实际上可以被类型转换为vo

我一直想知道为什么苹果在核心基础上使用数据类型,这些类型是指针类型的Type,而在COCOA中则不是。 例如,您可以引用UIColor对象,如
UIColor*
,而对CGColor对象的引用是
CGColorRef
?或者
NSURL*
CFURLRef
?为什么不总是使用
CGColor*
CFURL*
?或者相反,既然您从未直接访问
UIColor
NSURLRef
类型,为什么没有
UIColorRef
NSURL
类型

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


具体来说,苹果有在旧框架中这样做的习惯,但停止在Cocoa中这样做的原因是什么?这仅仅是一个风格问题吗?

之所以使用
NSURL*
vs
CFURLRef
就是因为它只是一种编码风格。COCOA是Objto-C API,ObjtoC中的通用样式是不具有Type,而Core Foundation是C API,它的通用样式是使用Type。这很大程度上取决于编码风格


id
vs
id*
-我不完全确定,但我猜这是历史性的,他们只是想让基本“对象”没有
*
。不过,我不确定这段历史。不过,这也只是一种时尚而已。

马特说了什么,但还有一点

基于C的api中的typedef还允许隐藏实现细节。例如,您可以拥有以下内容,而无需在公共头中定义_CFURL结构

typedef __CFURL *CFURLRef;
Objective-C长期以来一直以类别的形式提供这类功能,最近还增加了将实例变量声明移出头文件的功能。随着时间的推移,您将看到从SDK中的公共头文件中删除的所有实例变量

请注意,Cocoa框架很长,很长,早在CoreFoundation之前

至于为什么使用
id
而不是
id*
,这可以追溯到20世纪80年代初Objective-C首次创建时。具体来说,这种语言的概念是,你可以构建“软件集成电路”,可以像真正的集成电路一样“插在一起”。目标是保持C位作为实现细节,理想情况下,不要在API中公开

至于为什么最终使用
NSString*
而不是
NSString
,这在很大程度上正是因为该语言的C语言基础。我写了一封信,回答了一个稍微不同的问题


<>你也可能会发现。

可可(NeXTStep)实际上比核心基金要老。啊,我没意识到。我一直认为它是最新的。事实上,现在你提到它,我确实意识到它是下一步的一部分,我想我是在考虑将其作为苹果框架的一部分。啊,不错@bbum:-)。我甚至想在我的回答中说“但请等待@bbum发言”!我甚至试图找到一个答案,我发誓你以前写过
id
vs
id*
,但完全失败了。这里的答案很好。