zoukankan      html  css  js  c++  java
  • NSHashTable 和 NSMapTable学习

    今天,在实现play gif时间功能,我看见两个陌生班,只需看看这个纪录:

    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检查。
    如以下一个样例:

    	•	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
    • 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为弱引用。
    id delegate = ...;
    NSMapTable *mapTable = [NSMapTable mapTableWithKeyOptions:NSMapTableStrongMemory
                                                 valueOptions:NSMapTableWeakMemory];
    [mapTable setObject:delegate forKey:@"foo"];
    NSLog(@"Keys: %@", [[mapTable keyEnumerator] allObjects]);

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

    NSMapTableStrongMemory:指定相应的key或者value为强引用。 NSMapTableWeakMemory:指定相应的key或者value为弱引用。 NSMapTableCopyIn:指定相应的key或者value在增加到集合中的时候为copy

    NSMapTableObjectPointerPersonality:此选项是直接使用指针进行isEqual: hash


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


    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    科学计算和可视化,做数据分析与雷达图。
    Leetcode 429 N叉树的层序遍历
    Leetcode 867转置矩阵
    Leetcode 832 翻转图像
    Leetcode 1052 爱生气的书店老板
    Leetcode 337打家劫舍 III
    Leetcode 766 托普利茨矩阵
    Leetcode 1438绝对差不超过限制的最长连续子数组
    Leetcode 697 数组的度
    Leetcode 567 字符串的排列
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4690046.html
Copyright © 2011-2022 走看看