2011-09-05 16 views
9

के साथ एनएससीएच का उपयोग कैसे करें मैं एनएससीएसी में विभिन्न ऑब्जेक्ट्स स्टोर करना चाहता हूं और स्मृति चेतावनी हिट होने पर उन्हें स्वचालित रूप से हटा दिया जाता है। इसलिए मैंने निम्नलिखित NSDiscardableContent कार्यान्वयन लिखा है जिसे मैं एनएससीएच में मानों में डाल दिए गए उदाहरणों को लपेटने के लिए उपयोग करता हूं।एक सामान्य NSDiscardableContent कार्यान्वयन

लेकिन जब मैं "स्मृति चेतावनी अनुकरण" चलाता हूं तो मैं उन्हें कैश से हटा नहीं पाया जाता। क्या मेरे 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 
+0

यह कोई जवाब नहीं है लेकिन यह आपके डेलोक विधि में सेटिंग का उपयोग करने के लिए आम तौर पर खराब अभ्यास है - आपको नहीं पता कि कोई भी केवीओ आदि सुन रहा है या नहीं। बस इसके बजाय '[ऑब्जेक्ट रिलीज]' करें :) – deanWombourne

+0

@deanWombourne ऑब्जेक्ट पर किसी को भी नहीं सुनना चाहिए - (शून्य) dealloc, क्योंकि ऑब्जेक्ट अब बनाए रखा नहीं है। या क्या मैं कुछ गलत समझता हूँ? मैं सिर्फ इसलिए पूछ रहा हूं क्योंकि मैं विलुप्त होने वाले गुणों को भी पसंद करता हूं ... – radiospiel

+0

बस बीकोज़ यह अब तक नहीं टिकता है इसका मतलब यह नहीं है कि कोई भी सुन रहा है;) ऐप्पल इस विषय पर है: http://developer.apple.com/library/ मैक/# प्रलेखन/कोको/अवधारणात्मक/मेमोरीएमजीएमटी/लेख/mmPractical.html और यहां एक और दिलचस्प बातचीत: http://www.cocoabuilder.com/archive/cocoa/242096-avoiding-kvo-in-dealloc.html – deanWombourne

उत्तर

8

जहां तक ​​मैं कह सकता हूं, एनएससीएच का डिफ़ॉल्ट व्यवहार स्मृति चेतावनी होने पर वस्तुओं को फेंकना है।

तो आप अपने कैश में अपनी वस्तुओं को "नग्न" स्टोर कर सकते हैं जैसे कि यह एक NSDictionary था, और स्मृति को तंग होने पर उन्हें साफ़ कर दिया जाएगा। आपको उन्हें एक त्याग करने योग्य वस्तु में लपेटना नहीं है, या कुछ और नहीं करना है। जैसे

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

यह दस्तावेज़ से बहुत स्पष्ट नहीं है, लेकिन जहाँ तक मैं बता सकता हूँ, <NSDiscardableContent> सामग्री प्रोटोकॉल का उद्देश्य जरूरी रिहा बिना अधिक जटिल व्यवहार जिससे एक वस्तु, उप-घटक को रिहा कर सकते हैं जब स्मृति कम होने पर लागू करने के लिए है अपने आप।

संबंधित मुद्दे