Desidero memorizzare vari oggetti in un NSCache e farli rimuovere automaticamente quando si verifica un avviso di memoria. Così ho scritto la seguente implementazione di NSDiscardableContent che utilizzo per racchiudere le istanze che inserisco nei valori in un NSCache.Come utilizzare NSCache con un'implementazione generica NSDiscardableContent
Ma non li vedo mai essere rimossi dalla cache quando eseguo "Simulate Memory Warning". C'è qualcosa di sbagliato nella mia implementazione NSDiscardableContent? O devo fare qualcos'altro per fare in modo che la cache elimini i valori quando si verifica un avviso di memoria?
/** @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
Questa non è una risposta, ma è generalmente una cattiva pratica usare un'impostazione nel metodo dealloc - non si sa se qualcuno sta ascoltando KVO, ecc. Basta fare '[object release]' invece :) – deanWombourne
@deanWombourne There non dovrebbe essere nessuno che ascolta l'oggetto in - (void) dealloc, poiché l'oggetto non viene più mantenuto. O capisco qualcosa di sbagliato? Sto solo chiedendo perché preferisco deallocare le proprietà, anche ... – radiospiel
Solo perché non viene più conservato non significa che nessuno stia ascoltando;) Il punto di vista di Apple sull'argomento: http://developer.apple.com/library/ mac/# documentation/Cacao/Concettuale/MemoryMgmt/Articoli/mmPractical.html e una conversazione più interessante qui: http://www.cocoabuilder.com/archive/cocoa/242096-avoiding-kvo-in-dealloc.html – deanWombourne