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)
据我所知,NSCache的默认行为是在有内存警告时抛弃对象.
因此,您可以简单地将对象"裸"存储在缓存中,就好像它是一个NSDictionary,并且当内存变紧时它们将被清理.您不必将它们包装在可丢弃的对象中,也不必执行任何其他操作.例如
[myCache setObject:foo forKey:@"bar"]; // foo will be released if memory runs low
Run Code Online (Sandbox Code Playgroud)
从文档来看并不是很清楚,但据我所知,<NSDiscardableContent>内容协议的目的是实现更复杂的行为,即当内存不足时,对象可以释放子组件,而不必释放自身.
| 归档时间: |
|
| 查看次数: |
3198 次 |
| 最近记录: |