我的程序从左到右显示一个用UIImageViews平铺的水平滚动表面。 代码在UI线程上运行,以确保新显示的UIImageView具有分配给它们的新鲜加载的UIImage。 加载发生在后台线程上。 一切工作几乎没有问题,除了有一个口吃每个图像变得可见。 起初我以为我的后台工作人员在UI线程中locking了一些东西。 我花了很多时间看它,并最终意识到,UIImage在UI线程上进行一些额外的惰性处理时,它首先变得可见。 这让我很困惑,因为我的工作线程有明确的代码来解压缩JPEG数据。 无论如何,在预感上,我写了一些代码在后台线程中渲染成一个临时的graphics上下文,果然,口吃消失了。 UIImage现在被预先加载在我的工作线程上。 到现在为止还挺好。 问题是我的新的“强制延迟加载图像”方法是不可靠的。 它会导致间歇性的EXC_BAD_ACCESS。 我不知道UIImage究竟在幕后做了些什么。 也许是解压缩JPEG数据。 无论如何,这个方法是: + (void)forceLazyLoadOfImage: (UIImage*)image { CGImageRef imgRef = image.CGImage; CGFloat currentWidth = CGImageGetWidth(imgRef); CGFloat currentHeight = CGImageGetHeight(imgRef); CGRect bounds = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f); CGAffineTransform transform = CGAffineTransformIdentity; CGFloat scaleRatioX = bounds.size.width / currentWidth; CGFloat scaleRatioY = bounds.size.height / currentHeight; UIGraphicsBeginImageContext(bounds.size); […]