2014-02-10 3 views
0

Я реализую кэш, в котором я использую NSMutableDictionary для хранения слабой ссылки объектов. Я знаю, что NSMaptable обеспечивает эффективный способ хранения слабых и сильных рефери. Но его доступно на> = iOS6. Мое требование заключается в поддержке iOS> = 5. У меня есть лучший способ использования NSMutableDicitonary?. Любой фрагмент кода для хранения слабой ссылки в NSMutableDictionary, поможет. И также, могу ли я использовать NSCache для этого случая? Спасибо.Хранение слабых ссылок в NSMutableDictionary

ответ

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];

Примечание:

Поскольку объекты dealloc кэшируются в словаре, если ваш слабый ссылочный dic используется глобально, вы должны вызвать [dic removeDeallocRef]; в некотором правильном положении, например - (void)didReceiveMemoryWarning{}.

Смежные вопросы