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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

NSHashTable and NSMapTable

發布時間:2023/12/10 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NSHashTable and NSMapTable 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

NSSet和NSDictionary是兩個常用的類,但是他們默認假定了其中對象的內存行為。對于NSSet,object是強引用的,和NSDictionary中的value是一樣的。而NSDictionary中的key則是copy的,因此當開發者想要使NSSet的objects或者NSDictionary的values為weak,或者NSDictionary使用沒有實現協議的對象作為key時,比較麻煩(需要使用NSValue的方法valueWithNonretainedObject)。

在iOS6和MAC OS X 10.5開始,提供了相對于NSSet 和 NSDictionary 更通用的兩個類 NSHashTable 和 NSMapTable 。

NSHashTable是比NSSet更通用的一個相似物。NSHashTable相對于 NSSet/NSMutableSet 有如下特征:

  • NSSet/NSMutableSet 對其對象是強引用,使用isEqual方法去檢查對象是否相等,使用方法hash去獲取hash值。
  • NSHashTable 是可變的,沒有一個不變的和其對應。
  • NSHashTable 可以對其對象是weak 引用。
  • NSHashTable 可以在輸入(加入)的時候 copy 對象。
  • NSHashTable 可以包含任意指針,使用指針去做相等或者hashing檢查。

如下一個例子:

1 2 3 4 5 6 NSHashTable *hashTable = [NSHashTable hashTableWithOptions:NSPointerFunctionsCopyIn]; [hashTable addObject:@"foo"]; [hashTable addObject:@"bar"]; [hashTable addObject:@"foo"]; [hashTable addObject:@42]; NSLog(@"Members: %@", [hashTable allObjects]);

NSHashTable使用一個option去初始化,下面是可用的選項:

  • NSHashTableStrongMemory :和 NSPointerFunctionsStrongMemory 相同,使用此選項為默認的行為,和NSSet的內存策略相同。
  • NSHashTableWeakMemory :和 NSPointerFunctionsWeakMemory 相同,此選項使用weak存儲對象,當對象被銷毀的時候自動將其從集合中移除。
  • NSHashTableCopyIn :和 NSPointerFunctionsCopyIn 相同,此選項在對象被加入到集合之前copy它們。
  • NSHashTableObjectPointerPersonality :和 NSPointerFunctionsObjectPointerPersonality 相同,此選項是直接使用指針進行isEqual: 和 hash 。

NSMapTable和NSDictionary相對應,相對于 NSDictionary/NSMutableDictionary ,NSMapTable有如下的特征:

  • NSDictionary/NSMutableDictionary 會copy對應的key,強引用相應的value。
  • NSMapTable 是可變的,沒有一個不變的類與其對應。
  • NSMapTable 可以對其 key 和 value 弱引用,在這種情況下當key或者value被釋放的時候,此entry會自動從NSMapTable中移除。
  • NSMapTable 在加入一個(key,value)的時候,可以對其value設置為copy。
  • NSMapTable 可以包含任意指針,使用指針去做相等或者hashing檢查。

下面的NSMapTable例子中,key不是copy的(強引用的),value為弱引用。

1 2 3 4 5 id delegate = ...; NSMapTable *mapTable = [NSMapTable mapTableWithKeyOptions:NSMapTableStrongMemory valueOptions:NSMapTableWeakMemory]; [mapTable setObject:delegate forKey:@"foo"]; NSLog(@"Keys: %@", [[mapTable keyEnumerator] allObjects]);

NSMapTable對象在初始化的時候使用options去分別指定keys和values的行為。

NSMapTableStrongMemory :指定對應的key或者value為強引用。 NSMapTableWeakMemory :指定對應的key或者value為弱引用。 NSMapTableCopyIn :指定對應的key或者value在加入到集合中的時候為copy。 NSMapTableObjectPointerPersonality:此選項是直接使用指針進行isEqual: 和 hash 。

原文地址:http://nshipster.com/nshashtable-and-nsmaptable/.

轉載于:https://www.cnblogs.com/xincc/p/3680719.html

總結

以上是生活随笔為你收集整理的NSHashTable and NSMapTable的全部內容,希望文章能夠幫你解決所遇到的問題。

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