NSHashTable 和 NSMapTable的學習,關於學習的名言

來源:互聯網
上載者:User

NSHashTable 和 NSMapTable的學習,關於學習的名言

今天在實現play gif功能的時候,看到有兩個類比較陌生,就在此記錄下看到的東西:

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檢查。
如下面一個例子:

•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為弱引用。
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 。


不積跬步無以至千裡,閑來無事,搞一個屬於自己的小站,如果看到這篇文章感覺對你有協助的話,就支援關注一下我的小站:我的小站





聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.