2011-07-16 8 views
1

私はビットバケットを使ってUIImagesを生成し、その場で作成し、UIImageViewのイメージを交換します。 UIImageViewの画像を直接編集する方法はありますか? (すなわち、UIImageViewからUIImageを削除せずに特定のピクセルの色を変更し、それを描画し直してください)。imageWithCGImageが解放されていないか、imageNamedと同様のキャッシュにトラップされています。

現在、私はUIImageをフラッシュし、imageWithCGIImageを使用して新しいものを作成し、 UIImageViewに渡します。これは機能します。 MemLeaksは表示されません。しかし、約100回の画像交換の後、iPhone(3Gs)ではクラッシュします。 Cache'nの問題?キャッシュが解放されない場合、メモリの合計が電話機の限界に達しているように見えますが、Simulatorは各イメージスワップでメモリ消費を表示しません。漏れなく平らに保たれます。

注:topologyImage配列はRGBAピクセルバケットです。 REF変数は解放されません。そうしようとするたびに、次のコールがクラッシュします。それがなければ、Instrumentsは漏れはないと報告します。

=========

CGColorSpaceRef colorSpaceRef=CGColorSpaceCreateDeviceRGB(); 
CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault | kCGImageAlphaLast; 
CGColorRenderingIntent renderingIntent=kCGRenderingIntentDefault; 
CGDataProviderRef provider=CGDataProviderCreateWithData(NULL,topologyImage,(I*I*4),NULL); 
CGImageRef imageRef=CGImageCreate(I,I,8,4*8,4*I,colorSpaceRef,bitmapInfo,provider,NULL,false,renderingIntent); 

UIImage *img=[UIImage imageWithCGImage:imageRef]; 
if(IMG[NDXtopo].vw) { 
    [IMG[NDXtopo].vw setImage:img]; 
    } 
else { 
    IMG[NDXtopo].vw=[[UIImageView alloc] initWithImage:img]; 
    [master.view addSubview:IMG[NDXtopo].vw]; 
    } 

答えて

1

imageWithCGImageはCGImageの所有権を取るのではなく、内部でデータをコピーするようではありませんので、基本的には、特にCGImageRefをご参照を解放する必要があります。

これに関するドキュメントはかなり不明ですが、CGImageRefsとCGDataProviderRefsをリリースしなければ私のテストで見つけたことから、最終的にアプリケーションがメモリ警告を受けてクラッシュしてしまいます。あなたは、しかしで簡単なテストを行うことでクラッシュを持っているでしょう、なぜ

がわからない:

UIImageView *view = [[UIImageView alloc] init]; 
int I = 128; 
unsigned char *topologyImage = malloc(I*I*4*sizeof(unsigned char)); 

for(int i=0; i<I*I*4; i++) 
{ 
    topologyImage[i] = 100; 
} 

for(int i=0; i<1000; i++) 
{ 
    CGColorSpaceRef colorSpaceRef=CGColorSpaceCreateDeviceRGB(); 
    CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault | kCGImageAlphaLast; 
    CGColorRenderingIntent renderingIntent=kCGRenderingIntentDefault; 
    CGDataProviderRef provider=CGDataProviderCreateWithData(NULL,topologyImage,(I*I*4),NULL); 
    CGImageRef imageRef=CGImageCreate(I,I,8,4*8,4*I,colorSpaceRef,bitmapInfo,provider,NULL,false,renderingIntent); 
    CGColorSpaceRelease(colorSpaceRef); 
    CGDataProviderRelease(provider); 

    UIImage *img=[UIImage imageWithCGImage:imageRef]; 
    view.image = img; 
    CGImageRelease(imageRef); 
} 
free(topologyimage); 

が私のためにうまく動作しているようなので、何があなたのクラッシュを引き起こしていることは理由の外に何かのように思わたとえば、トポロジ画像に画像データをどのようにして得たかのようなあなたの例

+0

すばらしい返信ありがとうございます。 –

+0

::迅速な返信ありがとうございます。あなたのコードにいくつか変更を加えました。無料(topologyImage)とI = 320、すべてが機能しました。 UIImageViewをUIViewとCRASHに追加しました。イメージビューは、割り当て後にビューに追加されました。次に、イメージの作成とview.imageの割り当てをループします。シミュレータで正常に動作します。 iPhoneでクラッシュします。 –

+0

最後の投稿。 RELEASE()が追加されたので、私のコードで別のテストを実行してください。トポロジが作成され、タッチの大部分が削除されます。 84タッチは画像全体を除去し、タッチ85は新しいトポロジーマップを再生成する。 RELEASE()の前に、2番目のマップでクラッシュしました。 RELEASE()は10個のマップを通り、クラッシュしませんでした。ここに投稿する前に、私はRELEASE()のテストをして同じ結果を得ました。私は間違った順序で事をやったことがありますか? imageを作成する前に、colorSpaceRefをプロバイダの前にリリースすることは重要ですか?ありがとうございました。 –

関連する問題