2011-01-10 23 views
7

मैं UIImageview की छवि बदल रहा हूं [स्वयं सेट छवि: नया छवि];(आईफोन) UIImageView सेट छवि: लीक?

ऐसा लगता है कि जब भी मैं नई छवि के साथ ऐसा करता हूं, तो पूर्व छवि रिलीज़ नहीं होती है।
UIImageView की छवि को प्रतिस्थापित करने का सही तरीका क्या है?

धन्यवाद

+1

क्या आप थोड़ा और कोड पोस्ट कर सकते हैं? आप नई छवि कैसे बनाते/पॉप्युलेट करते हैं? – Axel

उत्तर

6

UIImageView setImage: कभी नहीं लीक, जब तक कि छवि आप गुजर रहे हैं जारी की नहीं होती है।

आपका कोड रिसाव नहीं होगा, अगर आप छवि दृश्य में एक स्वत: चित्रित छवि निर्दिष्ट कर रहे हैं, तो निम्न की तरह कुछ।

UIImage *newImage = [UIImage imageNamed:@"sampleImage"]; 
[yourImageView setImage:newImage]; 

लेकिन, यदि आप छवि कहीं आवंटन कर रहे हैं, आप इसे मैन्युअल जारी करने के लिए है।

+3

मैं अनिवार्य रूप से सममित कर रहा हूं कि आपका कोड क्या करता है। लेकिन "यंत्र" हर बार जब मैं ऐसा करता हूं तो स्मृति में वृद्धि होती है। "उपकरण आवंटन" में "आंकड़े" के लिए "कॉल पेड़" से बाहर टैब्स करना और "कॉल पेड़" पर वापस दिखाता है कि स्मृति उस स्थान पर वापस जाती है जहां यह होना चाहिए। शायद autoreleased वस्तु उपकरण में समय में ठीक से प्रदर्शित नहीं है? – eugene

+0

हो सकता है .. मुझे यकीन नहीं है .. क्या आप कोड पोस्ट कर सकते हैं कि आप कैसे बना रहे हैं और छवि असाइन कर रहे हैं? – EmptyStack

+0

[UIImage imageNamed:] छवि डेटा कैश करेगा, इसलिए हो सकता है कि "रिसाव" क्या हो रहा है। –

9

हां, UIImageView setImage रिसाव करता है! वास्तव में, CGImage, नहीं UIImage लीक (साधन "आवंटन" शो के रूप में)

मैं BrutalUIImage का उपयोग UIImage के बजाय

@interface BrutalUIImageView : UIView { 
    UIImage *image; 
} 

@property(nonatomic, retain) UIImage *image; 

@end 

@implementation BrutalUIImageView 
@synthesize image; 

- (void)setImage:(UIImage *)anImage { 
    [image autorelease]; 
    image = [anImage retain]; 
    [self setNeedsDisplay]; 
} 

- (void)drawRect:(CGRect)rect { 
    [super drawRect:rect]; 
    [image drawInRect:rect]; 
} 

- (void)dealloc { 
    [image release]; 
    [super dealloc]; 
} 

@end 
0

आपका BrutalUIImageVIew वर्ग वाकई दिलचस्प है, लेकिन छवि UIImage का उपयोग कर "drawInRect बनाकर: "विधि, मैं अपनी पीएनजी फ़ाइल के पारदर्शी क्षेत्रों को नुकसान पहुंचाता हूं।

क्या आप जानते हैं कि पीएनजी पारदर्शिता को रखते हुए छवि को कैसे आकर्षित किया जाए? (बेशक, UIImageVIew का उपयोग नहीं करते हुए "setImage:" को कॉल करते समय CGImage को लीक करता है)

+0

** BrutalUIImageView init ** विधि में 'self.opaque = NO;' सेट करने का प्रयास करें। –

0

हाँ UIImageView setImage वास्तव में लीक!

आप

[yourImageView setImage:[UIImage imageNamed:@"sampleImage.png"]]; 

के साथ छवियों का एक समूह के माध्यम से चक्र आप उपकरणों स्मृति के उपयोग को बढ़ाने पर देख सकते हैं। ऐसा लगता है कि के बाद से सभी छवियों के माध्यम से साइकिल चलाना मेमोरी उपयोग सपाट हो जाएगा।

सही, या कम से कम, यह करने के लिए गैर टपकाया तरीका है:

NSString *thePath = [[NSBundle mainBundle] pathForResource:@"sampleImage" ofType:@"png"]; 
    UIImage *newImage = [[UIImage alloc] initWithContentsOfFile:thePath]; 
    [yourImageView setImage:newImage]; 

मैं अपने कोड पर इस सत्यापित के रूप में मेरे एपीपी बड़े छवि फ़ाइलों का एक बहुत को दोहराते रहते गया था।

+0

जो आप देख रहे हैं वह UIImageView लीक नहीं है, लेकिन [UIImage imageNamed:] में कैशिंग –

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