这个问题只是出于好奇,但NSSet是如何实现的?它背后是什么数据结构以及添加和删除元素的访问时间是多少?如果我不得不猜测,我会说它是某种哈希表/字典数据结构,但在这种情况下为什么要区分NSSet和NSMutableSet?
答案 0 :(得分:19)
好吧,正如Bavarious在评论中指出的那样,Apple的实际CoreFoundation来源也是open and available for your perusal。 NSSet
在CFSet
之上实现,其代码是从哈希表模板生成的(就像CFDictionary
的代码一样),使用CFBasicHash
来完成工作。
可变性和不变性之间的区别似乎是结构中的一个标志问题(CFBasicHash.h
的第91行),从我的阅读到目前为止只影响对CFBasicHashAddValue
等函数的调用;有一个简单的检查可变性。然而,似乎Cobbal对于两者之间的复制/保留行为是正确的(我还没有看到那么远)。
PREVIOUSLY:
当我想知道实现细节时,我发现有时会仔细阅读GNUstep来源。当然,它们并不能保证以Apple的方式实现,但在某些情况下它们可能会有所帮助。他们的基金会版本:http://gnu.ethz.ch/debian/gnustep/gnustep-base-1.20.0/Headers/Foundation/(我希望这是最新的版本。如果没有,请有人纠正我。)
答案 1 :(得分:2)
回答问题的后半部分:拥有非可变版本的一个好处是它允许一种非常快速的复制方法,只需调用retain。
答案 2 :(得分:1)
我发现this link是您问题的有趣答案。 Apple的数据结构(NSArray
,NSSet
,NSDictionary
等)并未以简单明了的“标准方式”实现。在大多数情况下,它们的执行方式与其他任何设置的执行方式相同,但总体而言,它们会自动优化以获得最佳性能。所以,事实上,这很难说。虽然Apple在CFArray.h
(相当于NSArray
s)中提供了关于数组效率的文档,但是它没有提供关于集合效率的文档,尽管你可以自由地探讨/System/Library/Frameworks/CoreFoundation.framework/Headers/
查看其他数据结构实现。
此外,必须区分集合及其可变对应集合,就像NSString
和NSMutableString
,NSArray
和NSMutableArray
之间存在区别一样,以及NSDictionary
和NSMutableDictionary
(以及其他)。对于数据结构和字符串(以及其他一些类),Apple提供“只读”版本的类以保持通用性,以及用于操作的标准“可变”对应物。这只是Apple的标准做法。