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
使用