2012-06-02 2 views

ответ

7

Лучше всего обрабатывать NSCache как черный ящик, насколько это возможно.

От Caching and Purgeable Memory (курсив мой):

При добавлении элементов в кэше, вы можете указать значение затрат, которые будут связаны с каждой парой ключ-значение. Вызовите метод setTotalCostLimit:, чтобы установить максимальное значение для суммы всех затрат на кешированные объекты. Таким образом, когда добавляется объект, который толкает totalCost выше totalCostLimit, кеш может автоматически вытеснить некоторые из его объектов, чтобы вернуться ниже порога. Этот процесс выселения не гарантируется, поэтому попытка манипулирования значениями cost для достижения определенного поведения может нанести ущерб производительности кэша. Pass в 0 для cost, если у вас есть ничего полезного, или использовать setObject:forKey: метод, который не требует затрат, которые передаются в

. Примечание: предельное число и предел совокупной стоимости не являются строго соблюдается. То есть, когда кеш переходит на один из его пределов, некоторые из его объектов могут быть выселены немедленно, позже или никогда, все в зависимости от деталей реализации кэша.

+2

это хорошая идея, чтобы наблюдать на предупреждение памяти и очистить кэш тогда? –

+1

@EvilNodoer Проведя некоторые эксперименты, я обнаружил, что, хотя он не отвечает на 'UIApplicationDidReceiveMemoryWarningNotification', он фактически автоматически вытесняет свои объекты в ситуациях с низкой памятью (должен использовать какой-то другой механизм). – Rob

+0

@EvilNodoer BTW, я должен убрать свой комментарий о 'NSCache', реагирующем на давление памяти, поскольку это изменилось в iOS 7. Наблюдение' UIApplicationDidReceiveMemoryWarningNotification' было бы разумным. См. Http://stackoverflow.com/questions/19546054/nscache-crashing-when-memory-limit-is-reached-only-on-ios-7 – Rob

8

NSCache не реагирует на UIApplicationDidReceiveMemoryWarningNotification, но она автоматически выселить его объекты в условиях плохой памяти, очевидно, с помощью какой-то другой механизм.

Хотя я ранее предлагал наблюдать UIApplicationDidReceiveMemoryWarningNotification, это не тот случай. Никакой специальной обработки для ситуаций с низкой памятью не требуется, так как NSCache обрабатывает это автоматически.


Update:

С прошивкой 7, NSCache не только не реагирует на предупреждения памяти, но она также не появляется, чтобы должным образом очистить себя от давления памяти, либо (см NSCache crashing when memory limit is reached (only on iOS 7)).

I подкласс NSCacheUIApplicationDidReceiveMemoryWarningNotification наблюдать и очистить кэш, на предупреждение памяти:

@interface AutoPurgeCache : NSCache 
@end 

@implementation AutoPurgeCache 

- (id)init 
{ 
    self = [super init]; 
    if (self) { 
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(removeAllObjects) name:UIApplicationDidReceiveMemoryWarningNotification object:nil]; 
    } 
    return self; 
} 

- (void)dealloc 
{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidReceiveMemoryWarningNotification object:nil]; 

    // if not ARC, also 
    // 
    // [super dealloc]; 
} 

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