繁体   English   中英

在NSMutableDictionary中存储弱引用

[英]Storing weak references in NSMutableDictionary

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

这是我的弱引用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];

注意:

因为将dealloc对象缓存在字典中,所以如果您的弱引用dic是全局使用的,则应调用[dic removeDeallocRef]; 在某个适当的位置,例如- (void)didReceiveMemoryWarning{}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM