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 。

不积跬步无以至千里,闲来无事,搞一个属于自己的小站,如果看到这篇文章感觉对你有帮助的话,就支持关注一下我的小站:我的小站

时间: 2024-11-08 23:25:42

NSHashTable 和 NSMapTable的学习的相关文章

NSHashTable 和 NSMapTable学习

今天,在实现play gif时间功能,我看见两个陌生班,只需看看这个纪录: NSSet和NSDictionary是两个经常使用的类,可是他们默认假定了当中对象的内存行为.对于NSSet.object是强引用的,和NSDictionary中的value是一样的.而NSDictionary中的key则是copy的,因此当开发人员想要使NSSet的objects或者NSDictionary的values为weak,或者NSDictionary使用没有实现协议的对象作为key时,比較麻烦(须要使用NSV

NSHashtable and NSMaptable

NSSet, NSDictionary, NSArray是Foundation框架关于集合操作的常用类, 和其他标准的集合操作库不同, 他们的实现方法对开发者进行隐藏, 只允许开发者写一些简单的代码,让他们相信这些代码有理由正常的工作.. 然而这样的话最好的代码抽象风格就会被打破,苹果的本意也被曲解了. 在这种情况下, 开发者寻求更好的抽象方式来使用集合,或者说寻找一种更通用的方式. 对于 NSSet 和 NSDictionary,打破代码抽象风格的是他们在内存中存取object的方式. 在NS

iOS7: 漫谈基础集合类(NSArray,NSSet,NSOrderedSet,NSDictionary,NSMapTable,NSHashTable, NSPointerArray, NSIndexSet,NSCache, NSFastEnumeration)

基础集合类是每一个Mac/iOS应用的基本组成部分.在本文中,我们将对”老类”(NSArray, NSSet)和”新类”(NSMapTable, NSHashTable, NSPointerArray)进行一个深入的研究,探索每一个的效率细节,并讨论其使用场景. 提示:本文包含一些参照结果,但它们并不意味着绝对精确,也没有进行多个.复杂的测试.这些结果的目的是给出一个快速和主要的运行时统计.所有的测试基于iPhone 5s,使用Xcode 5.1b1和iOS 7.1b1,64位的程序.编译选项设

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

NSMapTable 不只是一个能放weak指针的 NSDictionary NSMapTable是早在Mac OS X 10.5(Leopard)的引入集合类.乍一看,这似乎是作为一个替换NSDictionary的存在,可以选择"strong"和"week"指针. 在这篇文章中,我会告诉你除了为什么它也非常有用之外的还有垃圾回收机制以及它是如何做NSDictionary中不能(或不应该)做的事情. 转至  http://www.isaced.com/post-23

[iOS翻译]《iOS 7 Programming Pushing the Limits》系列:你可能不知道的Objective-C技巧

简介: 如果你阅读这本书,你可能已经牢牢掌握iOS开发的基础,但这里有一些小特点和实践是许多开发者并不熟悉的,甚至有数年经验的开发者也是.在这一章里,你会学到一些很重要的开发技巧,但这仍远远不够,你还需要积累更多的实践来让你的代码更强力. /* 本文翻译自<iOS 7 Programming Pushing the Limits>一书的第三章“You May Not Know”,想体会原文精髓的朋友请支持原书正版. ——————(博客园.新浪微博)葛布林大帝 */ 目录: 一. 最好的命名实践

iOS -copy&amp;mutableCopy

1.对于非容器对象(NSString) 不可变 (NSString) copy :浅复制,指针指向 mutableCopy:深复制,生成可变字符串对象 可变(NSMutableString) copy: 深复制,生成不可变字符串对象 mutableCopy :深复制,生成可变字符串对象 2.对于容器类对象 数组 不可变(NSArray) copy :浅复制,指针指向 mutableCopy:深复制,生成可变数组对象(但,数组中的对象没有进行处理的话,数组的中的对象是浅复制) 可变(NSMutab

[转][iOS]NSHash?Table &amp; NSMap?Table

NSSet and NSDictionary, along with NSArray are the workhorse collection classes of Foundation. Unlike other standard libraries, implementation details are hidden from developers, allowing them to write simple code and trust that it will be (reasonabl

NSMapTable、NSHashTable与NSPointerArray的封装

说明 NSMapTable对应NSDictionary:NSHashTable对应NSSet:NSPointerArray对应NSArray,本人通过装饰设计模式对他们的使用进行了封装. 源码 https://github.com/YouXianMing/WeakList // // WeakDictionary.h // IteratorPattern // // Created by YouXianMing on 15/9/12. // Copyright (c) 2015年 YouXian

Cocoa 集合类型:NSPointerArray,NSMapTable,NSHashTable

iOS 中有很多种集合类型,最为常见的可能就 NSArray.NSDictionary.NSSet,但其实还有 NSPointerArray.NSMapTable.NSHashTable 等类型,虽然后面三个类型不常见,但是它们能在关键时刻,「救你一命」. 环境信息macOS 10.12.1Xcode 8.2iOS 10.2 先来看看传统的集合类型都有哪些短板: 放到集合中的对象,只能强引用 如果想要弱引用,要先用 NSValue 打包 不能放入 nil 而对于 NSPointerArray.N