Как использовать NSCache с общей реализацией NSDiscardableContent - PullRequest
10 голосов
/ 06 сентября 2011

Я хочу хранить различные объекты в NSCache и автоматически удалять их при попадании предупреждения в память. Поэтому я написал следующую реализацию NSDiscardableContent, которую я использую для переноса экземпляров, которые я помещаю в значения в NSCache.

Но я никогда не вижу, чтобы они удалялись из кэша, когда я запускаю «Предупреждение о симуляции памяти». Что-то не так с моей реализацией NSDiscardableContent? Или мне нужно сделать что-то еще, чтобы кеш сбрасывал значения при появлении предупреждения о памяти?

/** @brief generic implementation of the NSDiscardableContent for storing objects in an NSCache */
@interface GenericDiscardableObject : NSObject<NSDiscardableContent>
@property (nonatomic, retain) id object;
@property (nonatomic) NSUInteger accessCount;
+ (GenericDiscardableObject *)discardableObject:(id)ob;
@end

@implementation GenericDiscardableObject
@synthesize object, accessCount;

+ (GenericDiscardableObject *)discardableObject:(id)ob {
    GenericDiscardableObject *discardable = [[GenericDiscardableObject alloc] init];
    discardable.object = ob;
    discardable.accessCount = 0u;
    return [discardable autorelease];
}

- (void)dealloc {
    self.object = nil;
    [super dealloc];
}

- (BOOL)beginContentAccess {
    if (!self.object)
        return NO;
    self.accessCount = self.accessCount + 1;
    return YES;
}

- (void)endContentAccess {
    if (self.accessCount)
        self.accessCount = self.accessCount - 1;
}

- (void)discardContentIfPossible {
    if (!self.accessCount)
        self.object = nil;
}

- (BOOL)isContentDiscarded {
    return self.object == nil;
}
@end

1 Ответ

9 голосов
/ 29 июля 2012

Насколько я могу судить, стандартное поведение NSCache - выбрасывать объекты при появлении предупреждения о памяти.

Таким образом, вы можете просто хранить ваши объекты «голыми» в вашем кеше, как если бы это был NSDictionary, и они будут очищены, когда память станет тесной. Вам не нужно оборачивать их в отбрасываемый объект или делать что-либо еще. Э.Г.

[myCache setObject:foo forKey:@"bar"]; // foo will be released if memory runs low

Это не очень ясно из документации, но, насколько я могу судить, цель протокола контента <NSDiscardableContent> состоит в реализации более сложного поведения, при котором объект может освобождать подкомпоненты, когда памяти мало, без необходимости освобождения себя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...