2011-12-27 14 views
19
UIImage *img = [[UIImage alloc] initWithContentsOfFile:@"xx.jpg"] 
UIImage *img = [UIImage imageNamed:@"xx.jpg"] 

दूसरे प्रकार में छवि कैश्ड हो जाएगी?
जबकि पहले प्रकार में छवियों को कैश नहीं किया जाता है?क्या UIImage कैश छवि है?

उत्तर

27
  • -initWithContentsOfFile: कैशिंग बिना एक नई छवि बनाता है, यह एक साधारण प्रारंभ विधि है।

  • +imageNamed: विधि कैश का उपयोग करती है। यहाँ UIImage Reference से एक प्रलेखन है:

    इस विधि निर्दिष्ट नाम और रिटर्न कि वस्तु यदि वह मौजूद है के साथ एक छवि वस्तु के लिए प्रणाली कैश में लग रहा है। यदि मिलान करने वाली छवि ऑब्जेक्ट पहले से ही कैश में नहीं है, तो यह विधि छवि फ़ाइल को निर्दिष्ट फ़ाइल से लोड करती है, इसे कैश करती है, और फिर परिणामी ऑब्जेक्ट देता है।

    यूआईएममेज लोड छवि को बनाए रखेगा, इसे तब तक जीवित रखेगा जब तक कम स्मृति की स्थिति कैश को शुद्ध नहीं करेगी। स्विफ्ट के लिए

अद्यतन: स्विफ्ट में UIImage(named: "...") समारोह एक है कि छवि कैश है।

+0

कारण अतिरिक्त संसाधन प्रयोग की जाने वाली कैशिंग जाएगा या यह है कि वस्तु के लिए सिर्फ एक सूचक हो जाएगा? – raghul

+1

@ ड्रघुल यूआईएममेज केवल आपकी मौजूदा छवि को बनाए रखेगा, इसे रिलीज़ करने के बाद इसे जीवित रखेगा जब तक कम स्मृति स्थिति कैश को शुद्ध नहीं करेगी। – iHunter

+0

धन्यवाद ihunter !!! आपकी मदद करने के लिए – raghul

0

सही, दूसरा आइटम कैश किया गया है।

9

बस पथनाम मुद्दे से निपटने में सहायता के लिए इसे यहां छोड़ना चाहता था। यह एक तरीका है जिसे आप UIImage श्रेणी पर डाल सकते हैं।

+(UIImage *)imageNamed:(NSString *)name cache:(BOOL)cache { 
    if (cache) 
     return [UIImage imageNamed:name]; 
    name = [[NSBundle mainBundle] pathForResource:[name stringByDeletingPathExtension] ofType:[name pathExtension]]; 
    UIImage *retVal = [[UIImage alloc] initWithContentsOfFile:name]; 
    return retVal; 
} 

यदि आपके पास कैश पर स्विच करने का कोई आसान तरीका नहीं है, तो आप केवल 'imageNamed' का उपयोग कर समाप्त कर सकते हैं। ज्यादातर मामलों में यह एक बड़ी गलती है। this great answer for more details देखें (और प्रश्न और उत्तर दोनों को ऊपर उठाएं!)।

+1

में कैश को शुद्ध नहीं किया गया है यदि आप एक से अधिक अवधि में तोड़ना नहीं चाहते हैं, तो आप 'newName = [[NSBundle mainBundle] pathForResource का उपयोग कर सकते हैं: [name stringByDeletingPathExtension ] टाइप टाइप: [नाम पथ एक्सटेंशन]]; 'और 'UIImage * retVal = [[UIImage alloc] initWithContentsOfFile: newName];' – lnafziger

+1

धन्यवाद, यह बहुत अच्छा था, शामिल है! –

+1

नोट: उस मामले में जहां छवि के केवल * 2x संस्करण को बंडल में शामिल किया गया है, यह 'pathForResource' के रूप में टूट जाएगा @ 2x की जांच नहीं करेगा। अन्यथा, महान समाधान। – Joel

1

@ तेज में दान Rosenstark जवाब ..

extension UIImage { 

    static func imageNamed(name: String, cache: Bool) -> UIImage? { 
     if (cache) { 
      return UIImage(named: name) 
     } 

     // Using NSString for stringByDeletingPathExtension 
     let fullName = NSString(string: name) 
     let fileName = fullName.stringByDeletingPathExtension 
     let ext = fullName.pathExtension 
     let resourcePath = NSBundle.mainBundle().pathForResource(fileName, ofType: ext) 

     if let path = resourcePath { 
      return UIImage(contentsOfFile: path) 
     } 
     return nil 
    } 
} 
+0

चिल्लाओ के लिए धन्यवाद! –

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