0

我正在实现一个缓存,用于存储对象的NSMutableDictionary弱引用。我知道NSMaptable提供了一种有效的方法来存储弱引用和强引用。但是它在 >=iOS6 上可用。我的要求是支持 iOS>=5。有没有更好的方法然后使用NSMutableDicitonary?。任何用于存储弱引用的代码片段NSMutableDictionary都会有所帮助。此外,我可以在这种情况下使用 NSCache 吗?谢谢。

4

1 回答 1

0

这是我的弱引用类别 NSMutableDictionary。

.h 文件:

@interface NSMutableDictionary (WeakReferenceObj)
- (void)setWeakReferenceObj:(id)obj forKey:(NSString *)key;
- (void)removeDeallocRef;
@end

.m 文件:

#pragma mark - WeakReferenceObj
@interface WeakReferenceObj : NSObject
@property (nonatomic, weak) id weakRef;
@end

@implementation WeakReferenceObj
+ (id)weakReferenceWithObj:(id)obj{
    WeakReferenceObj *weakObj = [[WeakReferenceObj alloc] init];
    weakObj.weakRef = obj;
    return weakObj;
}
@end

#pragma mark - NSMutableDictionary(WeakReferenceObj)
@implementation NSMutableDictionary(WeakReferenceObj)

- (void)setWeakReferenceObj:(id)obj forKey:(NSString *)key{
    [self setObject:[WeakReferenceObj weakReferenceWithObj:obj] forKey:key];
}

- (void)removeDeallocRef{
    NSMutableArray *deallocKeys = nil;
    for (WeakReferenceObj *weakRefObj in [self allKeys]) {
        if (!weakRefObj.weakRef) {
            if (!deallocKeys) {
                deallocKeys = [NSMutableArray array];
            }
            [deallocKeys addObject:weakRefObj];
        }
    }
    if (deallocKeys) {
        [self removeObjectsForKeys:deallocKeys];
    }

}

@end

如何使用:

用你 [dic setObject:obj forKey:key];的替换[dic setWeakReferenceObj:obj forKey:key];

注:</p>

因为 dealloc 对象被缓存在字典中,如果你的弱引用 dic 是全局使用的,你应该[dic removeDeallocRef];在某个适当的位置调用,比如- (void)didReceiveMemoryWarning{}.

于 2014-02-10T07:00:20.670 回答