2011-05-02 24 views
13

這個問題只是出於好奇,但是,NSSet是如何實現的?它背後的數據結構是什麼以及添加和刪除元素的訪問時間是多少?如果我不得不猜測,我會說它是某種散列表/字典數據結構,但在這種情況下,爲什麼區分NSSet和NSMutableSet?NSSet實現

回答

19

好吧,正如Bavarious在評論中指出的那樣,Apple的實際CoreFoundation來源也是open and available for your perusalNSSetCFSet之上實現,其代碼從散列表模板生成(與CFDictionary一樣),使用CFBasicHash來完成該工作。

可變性與不可變性之間的區別似乎是結構中的一個標記(第012行的第91行),從我的閱讀到目前爲止隻影響對函數的調用,如CFBasicHashAddValue;有一個簡單的檢查可變性。然而,Cobbal似乎有可能對兩者之間的複製/保留行爲是正確的(我還沒有讀過)。

上一個:
當我想知道實現細節時,偶爾會發現它有趣並且有教育意義,可以細讀GNUstep源代碼。當然,它們並不能保證以蘋果公司的方式實施,但它們在某些情況下可能會有所幫助。他們的基礎版本:http://gnu.ethz.ch/debian/gnustep/gnustep-base-1.20.0/Headers/Foundation/(我希望這是最新的版本,如果沒有,請有人指正我)

+6

構建Foundation集合的Core Foundation集合是[開源](http://opensource.apple.com/source/CF/CF-550.42/)。 CFSet.c是由散列表模板機器生成的。集似乎被實現爲哈希值。 – 2011-05-02 23:37:33

+0

@Bavarious:太棒了!謝謝。你應該把它變成適當的答案,以便得到適當的關注。 – 2011-05-02 23:40:34

+0

Nah;隨時編輯你的答案,幷包括這一點,並可能擴大可變與不可變。 – 2011-05-02 23:41:20

1

我覺得this link是一個有趣的回答你的問題。 Apple的數據結構(NSArray,NSSet,NSDictionary等)沒有以簡單明瞭的「標準方式」實現。在大多數情況下,它們的執行方式與任何其他設置的執行方式相同,但總體而言,它們會自動優化以獲得最佳性能。所以,事實上,這很難說。儘管Apple在CFArray.h(相當於NSArray)中提供了有關陣列效率的文檔,但它沒有提供有關集合效率的文檔,儘管您可以自由地在/System/Library/Frameworks/CoreFoundation.framework/Headers/左右查看其他數據結構實現。

此外,必須有一組和其對應的可變區別,只是因爲有NSStringNSMutableStringNSArrayNSMutableArray,並NSDictionaryNSMutableDictionary(等等)之間的區別。對於數據結構和字符串(以及其他幾個類),Apple提供「只讀」版本的類以保留通用性,以及用於操作的標準「可變」對應版。這只是蘋果的標準做法。

2

要回答您的問題的後半部分:擁有非可變版本的一個好處是它允許一個簡單地調用retain的非常快速的複製方法。

+3

不變性的另一個好處是:你知道你不會意外地(或別人有目的地)改變集合。 – ughoavgfhw 2011-05-03 00:25:01