1

ObjC の新しい開発者で、塗りつぶしカラー アプリを作成しようとしています。画像をタッチすると色が変わってしまいますが、この機能でメロリリークしてしまいました。

-(void) updateImageWithColorSelected:(int) pos{
   CGImageRef imageRef = self.basicImage.CGImage;
   NSData *data = CGDataProviderCopyData(CGImagerGetDataProvider(imageRef));//leak here
   Byte *pixels = (Byte *)[data bytes];
   //change color...
   for(int i = 0; i< IMG_SIZE; i++){
     pixels[j] = 255;
   }
   CGDataProvider provider = CGDataProviderCreateWithData( NULL, pixels, [data length], NULL];
   CGImageRef newImageRef = CGImageCreate(w,h....);
   self.basicImage = [UIImage imageWithCGImage:newImageRef];
   //release newImageRef
   CGImagerRelease(newImageRef);

   // set basic image to img
   [self.img setImage:self.basicImage];

   data = nil;
   [data release];
}

NSData *data = CGDataProviderCopyData を除くすべてのコードを削除しようとしましたが、アプリはまだリークしています。「データ」を解放する方法を知っていますか?

前もって感謝します、

}

4

2 に答える 2

1
   // set basic image to img
   [self.img setImage:self.basicImage];

   data = nil;
   [data release];
}

リリースを nil ポインターに送信しています。

   [data release];
   data = nil;
}

これはうまくいくでしょう。

編集:問題CGDataProviderCreateWithData

データが解放されると、渡したデータ ポインタCGDataProviderCreateWithDataは無効になります。これは予期されることです。この関数を適切に使用するには、データ用のバッファーを割り当て、プロバイダーが解放されたときにデータを解放するためのコールバックを提供する必要があります。

最善の解決策はCGDataProviderCreateWithCFData、Foundation オブジェクトと CoreFoundation オブジェクト間の無料のブリッジングを利用して代わりに使用することです。

使用する:

CGDataProvider provider = CGDataProviderCreateWithCFData( (CFDataRef) data );
于 2012-07-12T08:04:49.753 に答える
0

CGDataProviderCreateWithData()現在、への呼び出しによって作成された、またはCGDataProviderCreateWithCFData()リークされているデータプロバイダーは、を呼び出すことによって解放される必要があることに注意してくださいCGDataProviderRelease()。(このリークは、元のリークされたデータと比較して間違いなく軽微です。)

于 2012-12-17T23:28:38.977 に答える