2011-02-11 22 views
7

मैं एक तरीका है जिसके एक पाश में कहा जाता है, कि कुछ इस तरह दिखता भीतर परिणाम:जारी renderInContext एक पाश

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
UIImageView *background = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, PAGE_WIDTH, PAGE_HEIGHT)]; 
background.image = backgroundImg; 

for (UIView *view in viewArray) 
{ 
    [background addSubview:view]; 
} 

UIGraphicsBeginImageContext(background.frame.size); 
[background.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

for (UIView *view in background.subviews) 
    [view removeFromSuperview]; 

background.image = nil; 
[background release]; 
[image retain]; 
[pool drain]; 
[image autorelease]; 
return image; 
हालांकि

, उपकरण मेमोरी मॉनिटर के अनुसार, स्मृति उपयोग ऊपर और ऊपर जाता है, और लूप के अंत तक कभी नहीं आता है। (यह दुर्घटनाओं।)

अगर मैं की जगह UIGraphicsBeginImageContext साथ

UIImage UIGraphicsEndImageContext को * छवि = someotherimage;

तो मेमोरी स्पाइक नहीं होती है, लेकिन ऑटोरिज़ पूल के कारण, लूप के हर पुनरावृत्ति पर आवंटित और कम हो जाती है। (यह क्रैश नहीं होता है)

और यदि मैं सिर्फ रेंडरइनकॉन्टेक्स्ट लाइन पर टिप्पणी करता हूं तो यह ठीक काम करता है। (क्रैश नहीं होता है)

तो ऐसा लगता है कि रेंडरइनकॉन्टेक्स्ट छवि पर किसी भी तरह पकड़ रहा है - मैं इसे कैसे रिलीज़ कर सकता हूं? या कोई वैकल्पिक सुझाव कृपया :)?

उत्तर

14

स्वाभाविक रूप से प्रयोग के 3 दिनों के बाद, मुझे जवाब मिल गया (जवाब, वैसे भी, और मुझे इस पर टिप्पणियों से प्रसन्नता होगी)।

मैं के बाद

UIGraphicsEndImageContext(); 

background.layer.contents = nil; 

जोड़ सकते हैं और परत में कैश स्मृति uncached :) है।

+0

आप एक उद्धारकर्ता हैं! –

+0

बहुत बहुत धन्यवाद .. –

0

मैं UIImageView का उपयोग नहीं कर रहा हूं, इसलिए layer.contents = nil सेटिंग मेरे लिए काम नहीं करती है। हालांकि, मुझे एक अलग समाधान मिला कि आदर्श नहीं होने पर काम करता है। ऐसा प्रतीत होता है कि renderInContext द्वारा आवंटित स्मृति मुख्य_queue निष्क्रिय होने तक मुक्त नहीं होती है। इसलिए, मैंने निम्नलिखित किया:

dispatch_queue_t queue = dispatch_queue_create("com.example.imageprocessing", DISPATCH_QUEUE_SERIAL); 

for (int k = 0; k < images.count; ++k) { 
    dispatch_async(queue, ^{ 
     dispatch_sync(dispatch_get_main_queue(), ^{ 
      @autoreleasepool { 
       ... 
       UIGraphicsBeginImageContext(self.view.bounds.size); 
       [view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
       image = UIGraphicsGetImageFromCurrentImageContext(); 
       UIGraphicsEndImageContext(); 
       ... 
      } 
     } 
    } 
} 

इसने मेरी मेमोरी समस्या हल की। मैं बहुत सारी छवियों को संसाधित नहीं कर रहा हूं, इसलिए मुझे नहीं पता कि प्रदर्शन कैसे प्रभावित होता है।