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


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


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

  • 相关阅读:
    牛客网 二叉树的镜像 JAVA
    牛客网 反转链表 JAVA
    牛客网 调整数组顺序使奇数位于偶数前面 JAVA
    Integer to Roman LeetCode Java
    Valid Number leetcode java
    Longest Common Prefix
    Wildcard Matching leetcode java
    Regular Expression Matching
    Longest Palindromic Substring
    Add Binary LeetCode Java
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4690046.html
Copyright © 2011-2022 走看看