2011-01-10 15 views
7

私はUIImageviewの画像を[self setImage:newImage]で変更しています。(iphone)UIImageView setImage:leaks?

newImageでこれを行うたびに、以前の画像は公開されていないようです。
UIImageViewのイメージを置き換える正しい方法は何ですか?あなたが渡している画像が解放されない場合を除き

は、リークしたことがないあなたに

+1

もう少しコードを投稿できますか?どのようにnewImageを作成/設定しますか? – Axel

答えて

6

UIImageView setImage:ありがとうございます。

あなたのコードは、自動再生された画像を画像ビューに割り当てる場合、次のようなコードが漏れません。

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

ただし、イメージをどこかに割り当てる場合は、手動で解放する必要があります。

+3

私は本質的にあなたのコードと同じことをしています。しかし、「楽器」は私がそれをするたびに増加する記憶を示しています。 「コールトリー」から「統計情報」への「計測器割り当て」のタブブッと「コールツリー」に戻ると、メモリは元の位置に戻ることを示しています。おそらく自動リリースされたオブジェクトが楽器の時間内に正しく表示されないのでしょうか? – eugene

+0

かもしれない..私は確信が持てません。あなたが作成してイメージを割り当てる方法をコードに投稿できますか? – EmptyStack

+0

[UIImage imageNamed:]は画像データをキャッシュするので、「リーク」の原因となる可能性があります。 –

9

はい、UIImageView setImageがリークします。 は実際に、私は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

を使用しCGImage、(楽器 "割り当て" が示すように)ないUIImage

はあなたのBrutalUIImageVIewクラスは本当に面白いですが、UIImage「drawInRectを使用して画像を描画することにより、リーク: "メソッド、私の損失は、私のPNGファイルの透過領域。

PNG透過性を維持しながら画像を描く方法をご存知ですか? (もちろん、「setImage:」と呼んでいる間にCGImageをリークするUIImageVIewを使用していません)

+0

** BrutalUIImageView init **メソッドで 'self.opaque = NO;'を設定しようとします。 –

0

はいUIImageView setImageは本当にリークします!

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

で画像の束を通してあなたサイクルはあなたが楽器のメモリ使用量が増加に見ることができます。 これは、 のサイクリングを経てすべての画像メモリ使用量が平らになってから、何らかの種類のキャッシュになっているようです。

正しい、あるいは少なくとも、それを行うための非漏出性の方法がある:私のAPPは、大きな画像ファイルの多く を巡回たよう

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

が、私は私のコードでこれを確認しました。

+0

あなたが見ているのは、UIImageViewが漏れているのではなく、[UIImage imageNamed:]にキャッシングしています。 –