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/8/sorting/2.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 NSSet实现_Objective C_Cocoa_Nsset - Fatal编程技术网

Objective c NSSet实现

Objective c NSSet实现,objective-c,cocoa,nsset,Objective C,Cocoa,Nsset,这个问题只是出于好奇,但是NSSet是如何实现的呢?它背后的数据结构是什么?添加和删除元素的访问时间是多少?如果让我猜的话,我会说这是某种哈希表/字典数据结构,但在这种情况下,为什么要区分NSSet和NSMutableSet呢?我发现这是对您的问题的一个有趣的答案。苹果的数据结构(NSArray,NSSet,NSDictionary,等等)并不是以简单的“标准方式”实现的。在大多数情况下,它们的性能与任何其他数据集的性能相同,但总体而言,它们会自动优化以获得最佳性能。所以,事实上,这很难说。虽然

这个问题只是出于好奇,但是NSSet是如何实现的呢?它背后的数据结构是什么?添加和删除元素的访问时间是多少?如果让我猜的话,我会说这是某种哈希表/字典数据结构,但在这种情况下,为什么要区分NSSet和NSMutableSet呢?

我发现这是对您的问题的一个有趣的答案。苹果的数据结构(
NSArray
NSSet
NSDictionary
,等等)并不是以简单的“标准方式”实现的。在大多数情况下,它们的性能与任何其他数据集的性能相同,但总体而言,它们会自动优化以获得最佳性能。所以,事实上,这很难说。虽然苹果公司在
CFArray.h
中提供了关于阵列效率的文档(相当于
NSArray
s),但它没有提供关于集合效率的文档,尽管您可以随意浏览
/System/Library/Frameworks/CoreFoundation.framework/Headers/
,查看其他数据结构实现


此外,集合和它的可变对应项之间必须有区别,就像
NSString
NSMutableString
NSArray
NSMutableArray
以及
NSDictionary
NSMutableDictionary
之间有区别一样。对于数据结构和字符串(以及其他很少的类),苹果提供了类的“只读”版本以保持通用性,同时还提供了标准的“可变”版本以进行操作。这只是苹果的标准做法。

回答你问题的后半部分:拥有不可变版本的一个好处是它允许一个非常快速的复制方法,只需调用retain。

正如Bavariage在评论中指出的,苹果实际的CoreFoundation来源也是如此
NSSet
是在上面实现的,它的代码是从哈希表模板生成的(就像
CFDictionary
的代码一样),使用来完成这项工作

可变性和不可变性之间的区别似乎在于结构中的标志(的第91行),从我目前的阅读来看,这只会影响对函数的调用,例如
CfBasichaddValue
;这里有一个简单的易变性检查。然而,Cobbal关于两者之间的复制/保留行为似乎是正确的(我只是还没有读到那么多)

以前:

当我对实现细节感到疑惑时,我发现偶尔细读一下源代码是很有趣和有教育意义的。当然,它们根本不能保证像苹果那样实施,但在某些情况下它们会有所帮助。他们的基金会版本:(我希望这是最新的版本。如果不是,请有人纠正我。)c是从哈希表模板生成的机器。集合似乎被实现为散列。@bavariable:太棒了!谢谢你应该把它变成一个恰当的答案,这样它才能得到恰当的关注;请随意编辑您的答案并包含该部分,也许还可以扩展到可变与不可变的内容。@bavariable:谢谢,完成了。这是一本相当不错的书;今晚可能会让我熬夜。如果我回答错了,请告诉我。不变性的另一个好处是:你知道你不能意外(或其他人故意)更改收藏的内容。