NSHashTable 和 NSMapTable的学习

来源:互联网 发布:穿越火线手游淘宝商城 编辑:程序博客网 时间:2024/04/30 13:05

http://blog.csdn.net/jijunyuan/article/details/39962923

NSSetNSDictionary是两个常用的类,但是他们默认假定了其中对象的内存行为。对于NSSetobject是强引用的,和NSDictionary中的value是一样的。而NSDictionary中的key则是copy的,因此当开发者想要使NSSetobjects或者NSDictionaryvaluesweak,或者NSDictionary使用没有实现协议的对象作为key时,比较麻烦(需要使用NSValue的方法valueWithNonretainedObject)。

iOS6MAC 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检查。
如下面一个例子:

[objc] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. •   NSHashTable *hashTable = [NSHashTable hashTableWithOptions:NSPointerFunctionsCopyIn];  
  2. •   [hashTable addObject:@"foo"];  
  3. •   [hashTable addObject:@"bar"];  
  4. •   [hashTable addObject:@"foo"];  
  5. •   [hashTable addObject:@42];  
  6. •   NSLog(@"Members: %@", [hashTable allObjects]);  

  • NSHashTable使用一个option去初始化,下面是可用的选项:
  • NSHashTableStrongMemory:和 NSPointerFunctionsStrongMemory相同,使用此选项为默认的行为,和NSSet的内存策略相同。
  • NSHashTableWeakMemory:和 NSPointerFunctionsWeakMemory相同,此选项使用weak存储对象,当对象被销毁的时候自动将其从集合中移除。
  • NSHashTableCopyIn :和 NSPointerFunctionsCopyIn 相同,此选项在对象被加入到集合之前copy它们。
  • NSHashTableObjectPointerPersonality:和NSPointerFunctionsObjectPointerPersonality相同,此选项是直接使用指针进行isEqual: hash
  • NSMapTableNSDictionary相对应,相对于NSDictionary/NSMutableDictionaryNSMapTable有如下的特征:
  • NSDictionary/NSMutableDictionarycopy对应的key,强引用相应的value
  • NSMapTable是可变的,没有一个不变的类与其对应。
  • NSMapTable 可以对其 key value弱引用,在这种情况下当key或者value被释放的时候,此entry会自动从NSMapTable中移除。
  • NSMapTable 在加入一个(keyvalue)的时候,可以对其value设置为copy
  • NSMapTable可以包含任意指针,使用指针去做相等或者hashing检查。
  • 下面的NSMapTable例子中,key不是copy的(强引用的),value为弱引用。
[objc] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. id delegate = ...;  
  2. NSMapTable *mapTable = [NSMapTable mapTableWithKeyOptions:NSMapTableStrongMemory  
  3.                                              valueOptions:NSMapTableWeakMemory];  
  4. [mapTable setObject:delegate forKey:@"foo"];  
  5. NSLog(@"Keys: %@", [[mapTable keyEnumerator] allObjects]);  

NSMapTable对象在初始化的时候使用options去分别指定keysvalues的行为。

NSMapTableStrongMemory:指定对应的key或者value为强引用。NSMapTableWeakMemory:指定对应的key或者value为弱引用。NSMapTableCopyIn:指定对应的key或者value在加入到集合中的时候为copyNSMapTableObjectPointerPersonality:此选项是直接使用指针进行isEqual: hash 

weak引用NSArray的实现

NSValue *value = [NSValue valueWithNonretainedObjectValue:myObj];[array addObject:value];and when you get the object:value = [array objectAtIndex:x];myObj = [value nonretainedObjectValue];



0 0
原创粉丝点击