2012-10-06 8 views
5

से UIImage मैं एक और अधिक जटिल परियोजना के लिए एक सरल परीक्षण की कोशिश कर रहा हूं लेकिन मुझे परेशान है कि नीचे दिया गया कोड क्यों क्रैश हो रहा है और EXC_BAD_ACCESS त्रुटि दे रहा है?CGImageRef

इसे UIView से कहा जाता है।

- (void)testing { 
     NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"ball.png" ofType:nil]; 
     CGImageRef imageRef = [[[UIImage alloc]initWithContentsOfFile:imagePath]CGImage]; 
// CGImageRetain(imageRef); 

     UIImage *newImage = [[UIImage alloc]initWithCGImage:imageRef]; 
     UIImageView *iv = [[UIImageView alloc]initWithImage:newImage]; 
     [self addSubview:iv]; 
} 

मेरा अनुमान है कि CGImageRef बनाए रखा नहीं किया जा रहा है लेकिन CGImageRetain (imageRef) जोड़ने है; कोई फर्क नहीं पड़ता।

मुझे यह भी ध्यान रखना चाहिए कि इस परियोजना में एआरसी चालू है।

संपादित

मैं थोड़ा और अधिक परीक्षण किया और पाया कि यह सीधे एआरसी से संबंधित है है के रूप में मैं ऊपर केवल कोड सहित 2 बुनियादी परियोजनाओं का निर्माण किया। एआरसी के साथ पहला बंद हो गया और यह पूरी तरह से काम किया। एआरसी के साथ अगला चालू हो गया और उसी त्रुटि के साथ बीएएम दुर्घटनाग्रस्त हो गया। दिलचस्प बात यह है कि मुझे एक वास्तविक लॉग त्रुटि मिली है जब पहली बार मैंने दुर्घटना से पहले परियोजना को भाग लिया था।

CGImageRef imageRef = [[[UIImage alloc]initWithContentsOfFile:imagePath]CGImage]; 

कि लाइन एक UIImage बनाता है, इसके CGImage संपत्ति हो जाता है, और फिर UIImage वस्तु विज्ञप्ति:

Error: ImageIO: ImageProviderCopyImageBlockSetCallback 'ImageProviderCopyImageBlockSetCallback' header is not a CFDictionary... 

उत्तर

9

इस लाइन समस्या है अभिव्यक्ति (उदाहरण के लिए इस लाइन के बाद)। तो CGImageRetain() जोड़ने के बाद भी काम नहीं करेगा।

बुनियादी समस्या CGImageRefCGImage से लौटे लगभग निश्चित रूप से UIImage के इवर है और जब UIImage deallocted है जारी किया जाएगा है।

इसे ठीक करने का सामान्य तरीका UIImage के जीवनकाल को विस्तारित करना है। आप इसे UIImage को स्थानीय चर में रखकर और CGImage (उदा। (void)uiimageVar के साथ) के अंतिम संदर्भ के बाद इसे संदर्भित करके कर सकते हैं। वैकल्पिक रूप से, आप, कि एक ही लाइन पर CGImageRef बनाए रख सकते हैं

CGImageRef imageRef = CGImageRetain([[[UIImage alloc] initWithContentsOfFile:imagePath] CGImage]); 

में के रूप में लेकिन अगर आप ऐसा करते हैं, मत भूलना imageRef जारी करने के लिए यह करने के बाद।

5

आप इस लिखा था। चूंकि आप उस लाइन पर CGImage को बनाए नहीं रख रहे हैं, CGImage का एकमात्र स्वामी UIImage है। तो जब UIImage जारी किया जाता है और तुरंत हटा दिया जाता है, तो यह CGImage भी हटा देता है।

UIImage जारी होने से पहले आपको CGImage को बनाए रखने की आवश्यकता है। इस प्रयास करें:

CGImageRef imageRef = CGImageRetain([[UIImage alloc]initWithContentsOfFile:imagePath].CGImage); 

और फिर समारोह के अंत में:

CGImageRef imageRef = [[[UIImage alloc]initWithContentsOfFile:imagePath]CGImage]; 

बनाया UIImage तुरंत इस पूर्ण निम्नलिखित जारी किया जाएगा:

CGImageRelease(imageRef); 
+0

शानदार, अब मैं देख रहा हूं कि क्या हो रहा है। कम से कम मैं सही रास्ते पर था। धन्यवाद रोब। – EcksMedia

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