tldr: ImagedNamed ठीक है। यह स्मृति अच्छी तरह से संभालती है। इसका इस्तेमाल करें और चिंता करना बंद करो।
नवंबर 2012 संपादित करें: ध्यान दें कि यह प्रश्न आईओएस 2.0 से है! तब से छवि आवश्यकताओं और हैंडलिंग बहुत से चले गए हैं। रेटिना छवियों को बड़ा बनाता है और उन्हें थोड़ा और जटिल बना देता है। आईपैड और रेटिना छवियों के लिए निर्मित समर्थन के साथ, आपको निश्चित रूप से अपने कोड में ImageNamed का उपयोग करना चाहिए। अब, वंशावली के लिए:
एप्पल देव मंचों पर sister thread कुछ बेहतर ट्रैफिक प्राप्त हुआ। विशेष रूप से Rincewind ने कुछ अधिकार जोड़ा।
आईफोन ओएस 2.x में समस्याएं हैं जहां छवि नामित: स्मृति चेतावनी के बाद भी कैश साफ़ नहीं किया जाएगा। उसी समय + छवि नामित: कैश के लिए बहुत अधिक उपयोग नहीं हुआ है, लेकिन सुविधा के लिए, जिसने संभवतया समस्या को बड़ा कर दिया है उससे कहीं अधिक होना चाहिए था।
चेतावनी
गति के मोर्चे पर, वहाँ क्या चल रहा है की एक सामान्य गलतफहमी है कि जब। सबसे बड़ी बात यह है कि + imageNamed: स्रोत फ़ाइल से छवि डेटा को डीकोड करता है, जो लगभग हमेशा डेटा आकार को बढ़ाता है (उदाहरण के लिए, एक स्क्रीन आकार की पीएनजी फ़ाइल संपीड़ित होने पर कुछ दर्जन केबी का उपभोग कर सकती है, लेकिन आधे एमबी से अधिक उपभोग करती है डिकंप्रेस्ड - चौड़ाई * ऊंचाई * 4)। इसके विपरीत + imageWithContentsOfFile: छवि डेटा की आवश्यकता होने पर हर बार उस छवि को डिक्रॉप कर देगा। जैसा कि आप कल्पना कर सकते हैं, अगर आपको केवल एक बार छवि डेटा की आवश्यकता है, तो आपने यहां कुछ भी नहीं जीता है, इसके अलावा छवि के कैश किए गए संस्करण को चारों ओर लटकने के अलावा, और इसकी आवश्यकता होने की संभावना अधिक है। हालांकि, अगर आपके पास एक बड़ी छवि है जिसे आपको अक्सर फिर से निकालना है, तो विकल्प हैं, हालांकि मैं मुख्य रूप से अनुशंसा करता हूं कि वह बड़ी छवि को फिर से निकालने से बचें :)।
कैश के सामान्य व्यवहार के संबंध में, यह फ़ाइल नाम पर आधारित कैश करता है (इसलिए + छवि नाम के दो उदाहरण: उसी नाम के साथ उसी कैश किए गए डेटा के संदर्भ में होना चाहिए) और कैश गतिशील रूप से बढ़ेगा + छवि नाम के माध्यम से अधिक छवियों का अनुरोध करें:। आईफोन ओएस 2.x पर एक बग एक स्मृति चेतावनी प्राप्त होने पर कैश को संकुचित होने से रोकता है। कैश iPhone OS 3.0 पर स्मृति चेतावनी का सम्मान करना चाहिए:
और
मेरे समझ है कि + imageNamed है। जब आपको मौका मिलता है और बग की रिपोर्ट करते हैं तो इसका परीक्षण करें यदि आपको लगता है कि यह मामला नहीं है।
तो, आपके पास यह है। imageNamed: आपकी खिड़कियों को तोड़ नहीं देगा या आपके बच्चों की हत्या नहीं करेगा। यह बहुत आसान है लेकिन यह एक अनुकूलन उपकरण है। दुर्भाग्य से वह बुरी तरह से नामित किया गया है और वहाँ कोई equivaluent उपयोग करने के लिए के रूप में आसान है - इसलिए लोगों को यह अति प्रयोग और जब यह बस
मैं UIImage करने के लिए एक वर्ग कहा कि ठीक करने के लिए अपने काम करता है परेशान हो:
// header omitted
// Before you waste time editing this, please remember that a semi colon at the end of a method definition is valid and a matter of style.
+ (UIImage*)imageFromMainBundleFile:(NSString*)aFileName; {
NSString* bundlePath = [[NSBundle mainBundle] bundlePath];
return [UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/%@", bundlePath,aFileName]];
}
रेंसविंड ने अपना खुद का अनुकूलित संस्करण बनाने के लिए कुछ उदाहरण कोड भी शामिल किया। मैं नहीं देख सकता कि यह रखरखाव के लायक है लेकिन यहां यह पूर्णता के लिए है।
CGImageRef originalImage = uiImage.CGImage;
CFDataRef imageData = CGDataProviderCopyData(
CGImageGetDataProvider(originalImage));
CGDataProviderRef imageDataProvider = CGDataProviderCreateWithCFData(imageData);
CFRelease(imageData);
CGImageRef image = CGImageCreate(
CGImageGetWidth(originalImage),
CGImageGetHeight(originalImage),
CGImageGetBitsPerComponent(originalImage),
CGImageGetBitsPerPixel(originalImage),
CGImageGetBytesPerRow(originalImage),
CGImageGetColorSpace(originalImage),
CGImageGetBitmapInfo(originalImage),
imageDataProvider,
CGImageGetDecode(originalImage),
CGImageGetShouldInterpolate(originalImage),
CGImageGetRenderingIntent(originalImage));
CGDataProviderRelease(imageDataProvider);
UIImage *decompressedImage = [UIImage imageWithCGImage:image];
CGImageRelease(image);
इस कोड के साथ व्यापार बंद यह है कि डीकोडेड छवि अधिक स्मृति का उपयोग करती है लेकिन प्रतिपादन तेज़ है।
मैं रहस्य में हूं। :) – Kriem
मुझे भी। ऐसा लगता है कि एसओ जीनियस से इतना भरा नहीं है जैसा मैंने सोचा था। –
ऐसा लगता है कि आपने कुछ समय की जांच की है। क्या आपने कोई प्रयोग किया है जो नवीनतम कोको-टच संस्करण के साथ नामित यूआईएममेज छवि का कोई नकारात्मक प्रभाव दिखाएगा? एक UITableView बनाएं और बहुत सारी (कई हजारों) पंक्तियां जोड़ें और देखें कि जब आप प्रत्येक पंक्ति में अलग-अलग छवि दिखाते हैं तो प्रदर्शन नीचे चला जाता है या नहीं। शायद तब लोग आपके निष्कर्षों पर टिप्पणी कर सकते हैं। – stefanB