這個問題只是出於好奇,但是,NSSet是如何實現的?它背後的數據結構是什麼以及添加和刪除元素的訪問時間是多少?如果我不得不猜測,我會說它是某種散列表/字典數據結構,但在這種情況下,爲什麼區分NSSet和NSMutableSet?NSSet實現
NSSet實現
回答
好吧,正如Bavarious在評論中指出的那樣,Apple的實際CoreFoundation來源也是open and available for your perusal。 NSSet
在CFSet
之上實現,其代碼從散列表模板生成(與CFDictionary
一樣),使用CFBasicHash
來完成該工作。
可變性與不可變性之間的區別似乎是結構中的一個標記(第012行的第91行),從我的閱讀到目前爲止隻影響對函數的調用,如CFBasicHashAddValue
;有一個簡單的檢查可變性。然而,Cobbal似乎有可能對兩者之間的複製/保留行爲是正確的(我還沒有讀過)。
上一個:
當我想知道實現細節時,偶爾會發現它有趣並且有教育意義,可以細讀GNUstep源代碼。當然,它們並不能保證以蘋果公司的方式實施,但它們在某些情況下可能會有所幫助。他們的基礎版本:http://gnu.ethz.ch/debian/gnustep/gnustep-base-1.20.0/Headers/Foundation/(我希望這是最新的版本,如果沒有,請有人指正我)
我覺得this link是一個有趣的回答你的問題。 Apple的數據結構(NSArray
,NSSet
,NSDictionary
等)沒有以簡單明瞭的「標準方式」實現。在大多數情況下,它們的執行方式與任何其他設置的執行方式相同,但總體而言,它們會自動優化以獲得最佳性能。所以,事實上,這很難說。儘管Apple在CFArray.h
(相當於NSArray
)中提供了有關陣列效率的文檔,但它沒有提供有關集合效率的文檔,儘管您可以自由地在/System/Library/Frameworks/CoreFoundation.framework/Headers/
左右查看其他數據結構實現。
此外,必須有一組和其對應的可變區別,只是因爲有NSString
和NSMutableString
,NSArray
和NSMutableArray
,並NSDictionary
和NSMutableDictionary
(等等)之間的區別。對於數據結構和字符串(以及其他幾個類),Apple提供「只讀」版本的類以保留通用性,以及用於操作的標準「可變」對應版。這只是蘋果的標準做法。
要回答您的問題的後半部分:擁有非可變版本的一個好處是它允許一個簡單地調用retain的非常快速的複製方法。
不變性的另一個好處是:你知道你不會意外地(或別人有目的地)改變集合。 – ughoavgfhw 2011-05-03 00:25:01
- 1. NSSet intersectsSet實現
- 2. 獲取實體關係NSSet
- 3. Apple如何實施NSSet?
- 4. coreData:從NSSet實體移動記錄
- 5. 獲取實體NSSet的最後記錄?
- 6. NSSet和NSArray的isEqual實現是否在內部使用isEqualToSet和isEqualToArray?
- 7. 對NSSet中的
- 8. 塊用的NSSet
- 9. NSSet containsObject Not Working?
- 10. XCTAssert NSSet計數
- 11. NSPredicate searching NSSet
- 12. CoreData - NSPredicate與NSSet中
- 13. NSManagedObject - NSSet被刪除?
- 14. 「的NSSet」在Objective-C
- 15. Bad Access on - [NSSet makeObjectsPerformSelector:withObject:]
- 16. NSSet的NSSet上的核心數據查詢
- 17. 發現在NSSet中的對象不同對象的
- 18. 如何檢查NSSet或NSCountedSet中的現有項目?
- 19. 從NSSet創建NSManagedObject時出現不規則的崩潰
- 20. 如何從NSSet實例中檢索一個隨機對象?
- 21. 得到的NSSet相關/相關實體 - CoreData
- 22. 通過迭代的NSSet
- 23. 讀/寫NSSet/NSMutableSet到文件
- 24. NSSet中的NSString查找
- 25. NSSet touchesShouldBegin:UIScrollView只是一個NSString
- 26. 使用KVC在NSSet中
- 27. 謂詞不適用於NSSet
- 28. NSSet比NSArray更快嗎?
- 29. 計數後NSSet無用嗎?
- 30. 使用的NSSet VS NSDictionary中
構建Foundation集合的Core Foundation集合是[開源](http://opensource.apple.com/source/CF/CF-550.42/)。 CFSet.c是由散列表模板機器生成的。集似乎被實現爲哈希值。 – 2011-05-02 23:37:33
@Bavarious:太棒了!謝謝。你應該把它變成適當的答案,以便得到適當的關注。 – 2011-05-02 23:40:34
Nah;隨時編輯你的答案,幷包括這一點,並可能擴大可變與不可變。 – 2011-05-02 23:41:20