2012-06-02 12 views
6

एनएससीएच की कुछ ऑटो-हटाने नीतियां क्या हैं? ऐप्पल के दस्तावेज में उनका उल्लेख नहीं है, और मैंने प्रयोगात्मक रूप से पाया कि एनएससीएच स्मृति चेतावनी का जवाब नहीं देता है।एनएससीएसी ऑटो-हटाने नीति

उत्तर

7

आप जितना संभव हो सके ब्लैक बॉक्स के रूप में NSCache का इलाज बंद कर सकते हैं।

से Caching and Purgeable Memory (जोर मेरा):

जब एक कैश करने के लिए आइटम जोड़ने के लिए, आप एक लागत मूल्य निर्दिष्ट कर सकते हैं प्रत्येक कुंजी-मान पेयर के साथ जुड़े होने। सभी कैश किए गए ऑब्जेक्ट्स की लागत के योग के लिए अधिकतम मान निर्धारित करने के लिए setTotalCostLimit: विधि पर कॉल करें। इस प्रकार, जब कोई ऑब्जेक्ट जोड़ा जाता है जो totalCost को totalCostLimit से ऊपर धक्का देता है, तो कैश थ्रेसहोल्ड के नीचे वापस आने के लिए स्वचालित रूप से अपनी कुछ वस्तुओं को बेदखल कर सकता है। यह निष्कासन प्रक्रिया की गारंटी नहीं है, इसलिए विशिष्ट व्यवहार प्राप्त करने के लिए cost मानों में हेरफेर करने का प्रयास कैश के प्रदर्शन के लिए हानिकारक हो सकता है।cost के लिए 0 में पास करता है, तो आप कुछ भी नहीं उपयोगी है, या setObject:forKey: विधि है, जो एक लागत की आवश्यकता नहीं है में पारित होने के लिए उपयोग

नोट:। संख्या सीमा और कुल लागत सीमा नहीं हैं सख्ती से लागू किया। यही है, जब कैश इसकी सीमाओं में से एक पर चला जाता है, तो उसके कुछ ऑब्जेक्ट कैश के कार्यान्वयन विवरण के आधार पर तुरंत, बाद में, या कभी भी बेदखल नहीं हो सकते हैं।

+2

यह एक अच्छा विचार स्मृति चेतावनी पर निरीक्षण और फिर कैश शुद्ध करने के लिए है? –

+1

@EvilNodoer कुछ प्रयोग करने के बाद, मैंने पाया कि जब यह 'UIAplplicationDidReceiveMemoryWarningNotification' का जवाब नहीं देता है, तो यह वास्तव में कम स्मृति स्थितियों में स्वचालित रूप से अपनी वस्तुओं को बेदखल करता है (कुछ अन्य तंत्र का उपयोग करना चाहिए)। – Rob

+0

@EvilNodoer बीटीडब्लू, मुझे स्मृति दबाव के जवाब में 'एनएससीएसीएच' के बारे में मेरी टिप्पणी वापस लेनी होगी, क्योंकि यह आईओएस 7 में बदल गया है। 'यूआईपीप्लिकेशनडिड रिसीव मेमरीवार्निंग नोटिफिकेशन' का निरीक्षण करना समझदार होगा। Http://stackoverflow.com/questions/19546054/nscache-crashing-when-memory-limit-is-reached-only-on-ios-7 देखें – Rob

8

NSCacheUIApplicationDidReceiveMemoryWarningNotification का जवाब नहीं है, लेकिन वह अपने स्पष्ट रूप से कुछ अन्य प्रणाली का उपयोग कर, कम स्मृति स्थितियों में अपनी वस्तुओं को बेदखल करता है।

जबकि मैंने पहले UIApplicationDidReceiveMemoryWarningNotification को देखने का सुझाव दिया था, यह मामला नहीं है। कम स्मृति स्थितियों के लिए कोई विशेष हैंडलिंग की आवश्यकता नहीं है, क्योंकि NSCache स्वचालित रूप से इसे संभालता है।


अद्यतन:

iOS 7 के रूप में, NSCache न केवल स्मृति चेतावनी का जवाब नहीं है, लेकिन यह भी ठीक से स्मृति दबाव पर ही शुद्ध करने के लिए प्रकट नहीं होता है, या तो (NSCache crashing when memory limit is reached (only on iOS 7) देखें)।

मैं NSCache उपवर्ग UIApplicationDidReceiveMemoryWarningNotification निरीक्षण, और स्मृति चेतावनी पर कैश शुद्ध करने के लिए:

@interface AutoPurgeCache : NSCache 
@end 

@implementation AutoPurgeCache 

- (id)init 
{ 
    self = [super init]; 
    if (self) { 
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(removeAllObjects) name:UIApplicationDidReceiveMemoryWarningNotification object:nil]; 
    } 
    return self; 
} 

- (void)dealloc 
{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidReceiveMemoryWarningNotification object:nil]; 

    // if not ARC, also 
    // 
    // [super dealloc]; 
} 

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