1

我正在努力完成的事情

  1. 在后台线程中绘制图像
  2. 将 转换CGImage为 aUIImage并将其添加到UIImageView主线程上的 a 。
  3. 淡入图像视图,它位于UICollectionViewCell从 alpha 值 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];

这些方法在 cellForRowAtIndexPath 方法中被调用,以及我的方法 fadeInImage

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

当我运行时,我会收到 Bad Access 调用并崩溃。我猜这与主线程和后台线程在彼此之间传递图像有关。有任何想法吗?多谢你们。

4

2 回答 2

1

我认为,只要您没有使用CGImageCreate或使用创建图像CGImageRetain,您就不必使用CGImageRelease(image);. 一旦您停止使用它,它应该会自动释放。一探究竟。

苹果文档

于 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 回答