日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[转] NSMapTable 不只是一个能放weak指针的 NSDictionary

發布時間:2025/3/20 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [转] NSMapTable 不只是一个能放weak指针的 NSDictionary 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

NSMapTable 不只是一個能放weak指針的 NSDictionary

NSMapTable是早在Mac OS X 10.5(Leopard)的引入集合類。乍一看,這似乎是作為一個替換NSDictionary的存在,可以選擇“strong”和“week”指針。 在這篇文章中,我會告訴你除了為什么它也非常有用之外的還有垃圾回收機制以及它是如何做NSDictionary中不能(或不應該)做的事情。

轉至 ?http://www.isaced.com/post-235.html

?

Leopard 中更多的Cocoa API

可可增加了幾個新的集合類在Mac OS X 10.5(Leopard)的。這些措施包括:

  • NSPointerArray
  • NSHashTable
  • NSMapTable

NSPointerArray完全是新的,但大部分的 NSHashTable 和 NSMapTable 的功能之前可從 opaque Foundation C structs of the same names 看到。

在某些方面,這些新的類,像NSMutableArray, NSMutableSet和的NSMutableDictionary一樣工作,但是給了你使用“week”垃圾回收指針的選擇。如果您使用的 Objective-C 2.0 垃圾回收機制,你應該知道什么是使用“week”指針,因此使用此選項的優勢應該是清楚的。

NSPointerArray也可用于純指針(指針不一定是Objective-C的類),但NSHashTable和的NSMutableArray類都需要它們的內容是Objective-C的對象。

雖然在一般意義上,NSPointerArray and NSHashTable 被設計為可以替換 NSMutableArray and NSMutableSet 的角色(有序和無序陣列)。
NSMapTable則是不同的,因為它可以在你的設計中使用,而NSMutableDictionary不能(或不應該)。

?

NSDictionary的局限性

NSDictionary提供了key-to-object的映射。從本質上講,NSDictionary中存儲的object位置是由“key”來索引的。

由于對象存儲在特定位置,NSDictionary中要求key的值不能改變(否則object的位置會突然錯誤)。為了保證這一點,NSDictionary中始終復制key到它私有位置。

這個key的復制行為也是NSDictionary如何工作的基礎,但這也有一個限制:你可以只使用Objective-C對象作為 NSDictionary的key,如果它支持NSCopying協議。此外,key應該是小且高效的,以至于復制的時候不會對CPU和內存造成負擔。

這意味著,NSDictionary中真的只有適合“value”類型的對象作為key(如簡短字符串和數字)。這不是離線的對象到對象的映射模型。

?

對象到對象的映射

NSMapTable(顧名思義)更適合于一般意義的映射。這取決于它是如何構造的,NSMapTable可以處理的“key-to-object”樣式映射的NSDictionary,但它也可以處理“object-to-object”的映射 - 也被稱為“associative array”或簡稱為“map”。

例如,一個NSMapTable構造如下:

NSMapTable *keyToObjectMapping =[NSMapTablemapTableWithKeyOptions:NSMapTableCopyInvalueOptions:NSMapTableStrongMemory];

將會和NSMutableDictionary工作得一樣一樣的,復制其“key”,并retaining它的“object”。

一個純粹的對象到對象(object-to-object)的映射可以構造如下:

NSMapTable *objectToObjectMapping =[NSMapTable mapTableWithStrongToStrongObjects];

一個對象到對象(object-to-object)的行為可能以前可以用NSDictionary來模擬,如果所有的key都是一個 NSNumber包含于該映射的源對象的內存地址(不要笑,我見過這種情況),但這些內存地址都是奔波在外,Cocoa中首次提供了一個真正的對象到對象 的映射NSMapTable。

?

NSMapTable的選項

NSMapTable提供的選項是由三部分組成:一個“memory option”(內存選項),一個“personality option”和“copy in”標志。你可以為每個部分使用一個選項(如果沒有提供一個選項的部分將會使用默認行為),這個部分都是位標志(bit flag)(二進制 “or” 合并在一起)。

理論上,NSMapTable允許以下選項:

  • NSMapTableStrongMemory (a "memory option")
  • NSMapTableWeakMemory (a "memory option")
  • NSMapTableObjectPointerPersonality (a "personality option")
  • NSMapTableCopyIn (a "copy option")

NSMapTableStrongMemory是默認的“memory option”。然而,默認的“personality option”,默認“copy in”的行為沒有名字那么這兩個值可以被視為隱含在列表中。

memory option

Objective-C使用“strong”和“week”作為垃圾回收機制相關的術語,它可能不是很明顯,這些選項可以在垃圾回收機制代碼之外使用(蘋果稱它為手動內存管理)。

在垃圾回收機制外,他們被定義為:

  • strong: 使用 retain 和 release
  • weak: 不使用 retain 和 release

NSMapTable只允許NSPointerFunctionsOptions對應的Objective-C對象“personality option”。還有其他NSPointerFunctionsOptions “personality option”里的“strong”指針的行為不包括retain和release,但這些選項在NSMapTable都是不允許的。

關于使用垃圾回收機制的“week”之外的警告:
指針將不會被歸零如在垃圾回收環境所以你必須要小心,不要取消引用指針,如果它被釋放。

Personality options

該NSMapTableObjectPointerPersonality選項用來控制是否isEqualTo:和哈希對象中的方法添加的對象添加到集合時使用。

  • NSMapTableObjectPointerPersonality指定
    對象的指針的值是用于直接比較和位移哈希生成(isEqualTo:和散列方法是不使用)。
  • NSMapTableObjectPointerPersonality 不指定(默認行為)
    的哈希值與isEqualTo:方法會在調用的關鍵在確定的存儲位置NSMapTable。這些方法的返回值不應改變(是不可變)為主要用在時間NSMapTable。

兩行為暗示內容實現了NSObject的協議,所以在這個協議方法也可以在key和object調用。特別地,描述的方法可以在被調用NSMapTable包含密鑰和對象無論使用的“Personality options”。該NSMapTable將只支持NSCoding如果所有的key和object實現了NSCoding協議了。

Copy options

如果NSMapTableCopyIn被指定,當NSCopying協議被加入時NSMapTable使用使自己的數據副本。如果不指定此選項(默認行為)將不會復制。


翻譯自:NSMapTable: more than an NSDictionary for weak pointers

這篇文章雖然很久了(2008年),但就算放在當下也是很有學習價值的,感謝Google translate,感謝Baidu translate!

?

?

?

總結

以上是生活随笔為你收集整理的[转] NSMapTable 不只是一个能放weak指针的 NSDictionary的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。