如何将NSCache与通用NSDiscardableContent实现一起使用

mar*_*rux 11 iphone cocoa-touch ios

我想在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
Run Code Online (Sandbox Code Playgroud)

Nic*_*ood 9

据我所知,NSCache的默认行为是在有内存警告时抛弃对象.

因此,您可以简单地将对象"裸"存储在缓存中,就好像它是一个NSDictionary,并且当内存变紧时它们将被清理.您不必将它们包装在可丢弃的对象中,也不必执行任何其他操作.例如

[myCache setObject:foo forKey:@"bar"]; // foo will be released if memory runs low
Run Code Online (Sandbox Code Playgroud)

从文档来看并不是很清楚,但据我所知,<NSDiscardableContent>内容协议的目的是实现更复杂的行为,即当内存不足时,对象可以释放子组件,而不必释放自身.