生データをファイルストレージ用のUIImageオブジェクトに変換するためのテスト関数であるコードイテレータがあります。2つの失敗パスまたはオプションがあります。私は失敗する可能性があります:
A.)リークがあることによって(機器はそれを示していません-機器はすべての割り当てが安定しているようです、私は何度も繰り返す必要があり、50と言うと、機器または通常のテスト機能の実行でクラッシュします)。以下の「b」オプションにより、メモリが原因のようです。
B.)UIImage内でCGオブジェクトの強制リリースを実行できます。その場合、アプリは続行します。イテレータが完了すると、サブ関数から返された画像の下にあるCGImageを解放しようとすると、最後の反復でテストがクラッシュします。イテレータは、要求した反復回数に関係なく、実行を完了します。これは、私がリークを修正したという事実を示しています。だから今、私は最後の反復について何が特別なのかを一緒にパズルしようとしていますか?(アーク?)
- (UIImage *) convertRGBToUIImage:(unsigned char *) buffer
withWidth:(int) width
withHeight:(int) height
{
CGColorSpaceRef colorSpace = nil;
CGContextRef context = nil;
CGImageRef ref = nil;
UIImage *retImg = nil;
colorSpace = CGColorSpaceCreateDeviceRGB();
if (colorSpace == NULL)
{
NSLog(@"ERROR: allocating color space convert Bitmap\n");
return nil;
}
context = CGBitmapContextCreate (buffer, width, height, 8, width * 4, colorSpace, kCGImageAlphaPremultipliedLast);
CGColorSpaceRelease(colorSpace );
if (context == NULL)
{
NSLog(@"ERROR: Context not created!");
return nil;
}
ref = CGBitmapContextCreateImage(context);
CGContextRelease(context);
retImg = [UIImage imageWithCGImage:ref];
CGImageRelease(ref);
return retImg;
}
イテレータの基本
for(int i = 0; i < numberiterations; i++)
{
UIImage *completedImage = [phelper convertRGBToUIImage:pBuffer withWidth:width withHeight:height]
//...save it out or display it
//Turn on one of the scenarios below
//scenario "A" -- will leak memory (instruments doesn't seem to turn anything up)
//ARC free
//completedImage = nil; //this will leak and fail after ~50 iterations
//-or-
//scenario "B" -- will crash on the very last iteration every time but can run x times
//CGImageRelease([completedImage CGImage];
}
Xcodeの分析ツールは、上記のシナリオ「A」を優先します。繰り返しますが、これを行うことができ、すべてが素晴らしいように見えますが、テストを正常に完了できません。これはARCを指していると思います。__bridge型のキャストを理解しようとしましたが、成功しませんでした。私は構文を正しく理解できないようで、おそらくそれは私の問題に対する答えではありません。ヒントやアイデアをいただければ幸いです。