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年 YouXianMing. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface WeakDictionary : NSObject

/**
 *  元素个数
 */
@property (readonly) NSUInteger count;

/**
 *  获取对象
 *
 *  @param aKey
 *
 *  @return 对象
 */
- (id)objectForKey:(id)aKey;

/**
 *  根据键值移除对象
 *
 *  @param aKey 键值
 */
- (void)removeObjectForKey:(id)aKey;

/**
 *  添加对象
 *
 *  @param anObject 对象
 *  @param aKey     键值
 */
- (void)setObject:(id)anObject forKey:(id)aKey;

/**
 *  键值枚举器
 *
 *  @return 枚举器
 */
- (NSEnumerator *)keyEnumerator;

/**
 *  对象枚举器
 *
 *  @return 对象枚举器
 */
- (NSEnumerator *)objectEnumerator;

/**
 *  移除所有对象
 */
- (void)removeAllObjects;

/**
 *  返回字典
 *
 *  @return 字典
 */
- (NSDictionary *)dictionaryRepresentation;

@end
//
//  WeakDictionary.m
//  IteratorPattern
//
//  Created by YouXianMing on 15/9/12.
//  Copyright (c) 2015年 YouXianMing. All rights reserved.
//

#import "WeakDictionary.h"

@interface WeakDictionary () {

    NSMapTable  *_mapTable;
}

@end

@implementation WeakDictionary

- (instancetype)init {

    self = [super init];
    if (self) {

        _mapTable = [NSMapTable strongToWeakObjectsMapTable];
    }

    return self;
}

- (id)objectForKey:(id)aKey {

    return [_mapTable objectForKey:aKey];
}

- (void)removeObjectForKey:(id)aKey {

    [_mapTable removeObjectForKey:aKey];
}

- (void)setObject:(id)anObject forKey:(id)aKey {

    [_mapTable setObject:anObject forKey:aKey];
}

- (NSEnumerator *)keyEnumerator {

    return [_mapTable keyEnumerator];
}

- (NSEnumerator *)objectEnumerator {

    return [_mapTable objectEnumerator];
}

- (void)removeAllObjects {

    [_mapTable removeAllObjects];
}

- (NSDictionary *)dictionaryRepresentation {

    return [_mapTable dictionaryRepresentation];
}

@synthesize count = _count;
- (NSUInteger)count {

    return _mapTable.count;
}

- (NSString *)description {

    return [NSString stringWithFormat:@"%@", _mapTable.dictionaryRepresentation];
}

@end
//
//  WeakSet.h
//  IteratorPattern
//
//  Created by YouXianMing on 15/9/12.
//  Copyright (c) 2015年 YouXianMing. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface WeakSet : NSObject

/**
 *  元素个数
 */
@property (readonly)            NSUInteger  count;

/**
 *  所有对象
 */
@property (readonly, copy)      NSArray    *allObjects;

/**
 *  获取一个对象
 */
@property (readonly, nonatomic) id          anyObject;

/**
 *  获取集合
 */
@property (readonly, copy)      NSSet      *setRepresentation;

- (id)member:(id)object;
- (NSEnumerator *)objectEnumerator;
- (void)addObject:(id)object;
- (void)removeObject:(id)object;
- (void)removeAllObjects;
- (BOOL)containsObject:(id)anObject;

@end
//
//  WeakSet.m
//  IteratorPattern
//
//  Created by YouXianMing on 15/9/12.
//  Copyright (c) 2015年 YouXianMing. All rights reserved.
//

#import "WeakSet.h"

@interface WeakSet () {

    NSHashTable  *_hashTable;
}

@end

@implementation WeakSet

- (instancetype)init {

    self = [super init];
    if (self) {

        _hashTable = [NSHashTable weakObjectsHashTable];
    }

    return self;
}

- (id)member:(id)object {

    return [_hashTable member:object];
}

- (NSEnumerator *)objectEnumerator {

    return [_hashTable objectEnumerator];
}

- (void)addObject:(id)object {

    [_hashTable addObject:object];
}

- (void)removeObject:(id)object {

    [_hashTable removeObject:object];
}

- (void)removeAllObjects {

    [_hashTable removeAllObjects];
}

- (BOOL)containsObject:(id)anObject {

    return [_hashTable containsObject:anObject];
}

@synthesize count = _count;
- (NSUInteger)count {

    return _hashTable.count;
}

@synthesize allObjects = _allObjects;
- (NSArray *)allObjects {

    return [_hashTable allObjects];
}

@synthesize anyObject = _anyObject;
- (id)anyObject {

    return [_hashTable anyObject];
}

@synthesize setRepresentation = _setRepresentation;
- (NSSet *)setRepresentation {

    return [_hashTable setRepresentation];
}

- (NSString *)description {

    return [NSString stringWithFormat:@"%@", _hashTable.allObjects];
}

@end
//
//  WeakArray.h
//  IteratorPattern
//
//  Created by YouXianMing on 15/9/12.
//  Copyright (c) 2015年 YouXianMing. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface WeakArray : NSObject

@property (readonly, copy) NSArray    *allObjects;
@property (readonly)       NSUInteger  count;

- (id)objectAtIndex:(NSUInteger)index;
- (void)addObject:(id)object;
- (void)removeObjectAtIndex:(NSUInteger)index;
- (void)insertObject:(id)object atIndex:(NSUInteger)index;
- (void)replaceObjectAtIndex:(NSUInteger)index withPointer:(id)object;
- (void)compact;

@end
//
//  WeakArray.m
//  IteratorPattern
//
//  Created by YouXianMing on 15/9/12.
//  Copyright (c) 2015年 YouXianMing. All rights reserved.
//

#import "WeakArray.h"

@interface WeakArray () {

    NSPointerArray *_pointerArray;
}

@end

@implementation WeakArray

- (instancetype)init {

    self = [super init];
    if (self) {

        _pointerArray = [NSPointerArray pointerArrayWithOptions:NSPointerFunctionsWeakMemory];
    }

    return self;
}

- (id)objectAtIndex:(NSUInteger)index {

    return [_pointerArray pointerAtIndex:index];
}

- (void)addObject:(id)object {

    [_pointerArray addPointer:(__bridge void *)(object)];
}

- (void)removeObjectAtIndex:(NSUInteger)index {

    [_pointerArray removePointerAtIndex:index];
}

- (void)insertObject:(id)object atIndex:(NSUInteger)index {

    [_pointerArray insertPointer:(__bridge void *)(object) atIndex:index];
}

- (void)replaceObjectAtIndex:(NSUInteger)index withPointer:(id)object {

    [_pointerArray replacePointerAtIndex:index withPointer:(__bridge void *)(object)];
}

- (void)compact {

    [_pointerArray compact];
}

@synthesize count = _count;
- (NSUInteger)count {

    return _pointerArray.count;
}

- (NSString *)description {

    return [NSString stringWithFormat:@"%@", _pointerArray.allObjects];
}

@synthesize allObjects = _allObjects;
- (NSArray *)allObjects {

    return _pointerArray.allObjects;
}

@end

使用

时间: 2024-10-12 06:53:32

NSMapTable、NSHashTable与NSPointerArray的封装的相关文章

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位的程序.编译选项设

Cocoa 集合类型:NSPointerArray,NSMapTable,NSHashTable

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

KVOController 分析

<!doctype html> KVOController 是由 facebook 开源的 kvo 组件,其特点是简单易用且安全. KVO现状 kvo 全称 key-value observing,由 cocoa 框架提供的支持观察者模式的技术,结合 Objective-C 非常易用,在很多场合都可以有效地替换 NSNotificationCenter.但其也有一些致命的缺点,导致很容易引发 crash.其使用规则如下: addObserver 和 removeObserver 必须配对出现.

ARC内存管理中容易忽略的问题

目录: 一.字符串(String) 1.1.字符串的创建 1.2.字符串的isa 二.拷贝(copy) 2.1.immutable对象的copy 2.2.mutable对象的copy 2.3.浅拷贝与深拷贝 2.4 .单层深拷贝 三. 集合(Collections) 3.1.NSMapTable 3.2.NSHashTable 3.3.NSPointerArray 一.字符串(String) 看到好几篇文章都在说这道面试题,字符串差不多是每个高级语言必有的,在实际项目中也的确是使用的最多类型之一

iOS -copy&amp;mutableCopy

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

NSHashtable and NSMaptable

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

NSHashTable 和 NSMapTable的学习

今天在实现play gif功能的时候,看到有两个类比较陌生,就在此记录下看到的东西: NSSet和NSDictionary是两个常用的类,但是他们默认假定了其中对象的内存行为.对于NSSet,object是强引用的,和NSDictionary中的value是一样的.而NSDictionary中的key则是copy的,因此当开发者想要使NSSet的objects或者NSDictionary的values为weak,或者NSDictionary使用没有实现协议的对象作为key时,比较麻烦(需要使用N

NSHashTable 和 NSMapTable学习

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

封装NSMapTable并简易的使用

NSMapTable是弱引用的字典,可以用来存储对象,该对象消失了也没有关系,对于控制器越级跳转相当有用:) WeakDictionary.h 与 WeakDictionary.m // // WeakDictionary.h // 弱引用字典 // // http://www.cnblogs.com/YouXianMing/ // Copyright (c) 2014年 Y.X. All rights reserved. // #import <Foundation/Foundation.h>