2011-09-05 9 views
9

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 
+0

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

+0

@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

+0

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

risposta

8

Per quanto posso dire, il comportamento predefinito di NSCache è quello di lanciare oggetti via quando c'è un avviso di memoria.

Così puoi semplicemente archiviare i tuoi oggetti "nudi" nella cache come se fosse un NSDictionary, e saranno ripuliti quando la memoria si stringe. Non è necessario avvolgerli in un oggetto scartato o fare qualsiasi altra cosa. Per esempio.

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

Ma non è molto chiaro dalla documentazione, ma per quanto posso dire, lo scopo del protocollo <NSDiscardableContent> contenuto è per implementare un comportamento più complesso quale un oggetto può rilasciare sottocomponenti quando la memoria è basso, senza necessariamente rilasciare si.

Problemi correlati