1

私が達成しようとしていること

  1. 背景のスレッドで画像を描く
  2. をに変換CGImageし、メインスレッドUIImageのに追加します。UIImageView
  3. UICollectionViewCellアルファ値0から1にサブクラス化されたイメージビューでフェードインします。
  4. スクロールするときに途切れがないようにすべてを実行しますUICollectionView

問題

動作は、最初は正常に動作しますが、すぐに予測不可能になり、通常はすぐにEXC_BAD_ACCESSエラーが発生し、uiimageをcgimageに、またはその逆に変換するプロセスのどこかで発生します。

コード

    //setup for background drawing
    CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
    CGContextRef context;
    context = CGBitmapContextCreate(NULL, 250, backgroundHeight - 112, 8, 250 * 4, colorSpaceRef, kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little);
    CGColorSpaceRelease(colorSpaceRef);

    //Take the image I want drawn, convert to cgimage for background drawing
    CGImageRef  image = contentImage.CGImage;
    CGContextDrawImage(context, CGRectMake(0, 0, 250, backgroundHeight - 112), image);
    CGImageRelease(image);
    CGImageRef outputImage = CGBitmapContextCreateImage(context);
    imageRef = outputImage;

    [self performSelectorOnMainThread:@selector(addImageToView) withObject:nil waitUntilDone:YES];
    CGContextRelease(context);
    CGImageRelease(outputImage);

addImageToViewメソッドは、画像を作成してUIImageViewに追加するだけです。

UIImage * image = [UIImage imageWithCGImage:imageRef];
[photoView setImage:image];

これらのメソッドは、私のメソッドfadeInImageとともに、cellForRowAtIndexPathメソッド中に呼び出されます。

[UIView animateWithDuration:.6 delay:0 options:UIViewAnimationOptionCurveEaseIn animations:^{
    photoView.alpha = 1;
}completion:nil];

実行すると、BadAccess呼び出しが発生してクラッシュします。メインスレッドとバックグラウンドスレッドが画像を相互に受け渡していることと関係があると思います。何か案は?みんなありがとう。

4

2 に答える 2

1

CGImageCreateを使用してイメージを作成したり使用したりしない限り、を使用する必要はないと思いCGImageRetainますCGImageRelease(image);。使用をやめると自動的に解放されます。見てみな。

Appleのドキュメント

于 2012-10-26T18:57:53.310 に答える
0

最初の画像をリリースしないでくださいCGImageRelease(image);

そして、おそらく変更する方が良いでしょう:

CGImageRef outputImage = CGBitmapContextCreateImage(context);
imageRef = outputImage;

[self performSelectorOnMainThread:@selector(addImageToView) withObject:nil waitUntilDone:YES];

に:

CGImageRef outputImage = CGBitmapContextCreateImage(context);
UIImage* result = [UIImage imageWithCGImage:imageRef]
[self performSelectorOnMainThread:@selector(addImageToView:) withObject:result waitUntilDone:YES];

その後:

- (void) addImageToView:(UIImage*) image {
    [photoView setImage:image];
}

あるいは:

[photoView performSelectorOnMainThread:@selector(setImage:) withObject:result waitUntilDone:YES];
于 2012-10-26T19:06:49.297 に答える