1

メモリ リークが発生しました。解決方法がわかりません。

これは漏れているコードです:

[newImg release];
CGColorSpaceRef d_colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context =  CGBitmapContextCreate(Data, width, 
                                              height, 
                                              8, 4*width, 
                                              d_colorSpace, 
                                              kCGImageAlphaNoneSkipFirst);
UIGraphicsPushContext(context);
CGImageRef new_img = CGBitmapContextCreateImage(context);
UIImage * convertedImage = [[UIImage alloc] initWithCGImage:
                             new_img];
CGImageRelease(new_img);
CGContextRelease(context);
CGColorSpaceRelease(d_colorSpace);
newImg = convertedImage;

Data に格納されているピクセル情報を変更し、このメソッドを使用して Data から UIImage を作成します (これは unsigned char 配列です)。

xcode インスツルメントは、ここにリークがあることを示しています。

CGImageRef new_img = CGBitmapContextCreateImage(context);

そしてここ:

UIImage * convertedImage = [[UIImage alloc] initWithCGImage:
                             new_img];

私はそれらの両方を解放しますが:(誰かがこれを解決する方法を教えてもらえますか?

よろしくお願いします^ - ^

4

4 に答える 4

0

ConvertedImage をリリースしていないように思えます この行を置き換えてみてください

UIImage * convertedImage = [[UIImage alloc] initWithCGImage:
                             new_img];

これで

UIImage * convertedImage = [[[UIImage alloc] initWithCGImage:
                             new_img] autorelease];

あなたのコードで。

そして、私があなたを正しく理解していれば(質問へのコメントに基づいて)、 newImg プロパティを次のように宣言します。

@property (nonatomic, retain) UIImage* newImg; //or something like that

この場合、このプロパティの合成されたセッターは、それに割り当てられるすべてのオブジェクトを保持します。値が変化したら離します。したがって、それをリリースする責任はありません。次の行を削除する必要があります。

[newImg release];

あなたができる最善のことは、Advanced Memory Management Programming Guideを読むことだと思います。それほど長くはありませんが、iOS メモリ管理で使用される主な規則の完全な概要を提供します。

また、CoreFoundation オブジェクト/関数も使用するため、Core Foundation のメモリ管理プログラミング ガイドを検討してください。

私はそれが役立つことを願っています:)

于 2013-05-05T15:05:27.380 に答える
0

編集:元の投稿は役に立たなかったので、削除して再投稿しました。

代わりにこれを試してください:

//[newImg release]; DELETE THIS LINE
CGColorSpaceRef d_colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context =  CGBitmapContextCreate(Data, width, 
                                              height, 
                                              8, 4*width, 
                                              d_colorSpace, 
                                              kCGImageAlphaNoneSkipFirst);
UIGraphicsPushContext(context);
CGImageRef new_img = CGBitmapContextCreateImage(context);

newImg = [UIImage imageWithCGIImage:new_img];

CGImageRelease(new_img);
CGContextRelease(context);
CGColorSpaceRelease(d_colorSpace);

これをテストしましたが、私の側では漏れません。

于 2010-02-26T13:47:35.333 に答える
0

CGBitmapContextCreate は、指定したデータを解放しません。NULL を指定するか (この場合、コンテキストは独自のバッキング メモリを管理します)、コンテキストを解放した後に自分で解放します。

編集:ここに関連ドキュメントがあります。

于 2012-09-03T08:36:50.383 に答える