【问题标题】:Creating a UIImage outside the main thread在主线程外创建 UIImage
【发布时间】:2012-10-16 19:46:55
【问题描述】:

我正在使用下面的代码在后台线程中创建 UIImage,然后将此图像设置为我在主线程上的视图图像。偶尔,我会遇到一个糟糕的访问错误。我想知道我是否不应该在后台线程中创建 UIImage 。有什么想法吗?

CGImageRef imageRef =
    CGImageCreate(serverInit.rfbWidth,serverInit.rfbHeight,bitsPerComponent,bitsPerPixel,bytesPerRow,colorSpaceRef,bitmapInfo,provider,NULL,NO,renderingIntent);

    screenImage = [UIImage imageWithCGImage:imageRef];

    CFRelease(imageRef);

    [view performSelector:@selector(replaceImage:) onThread:[NSThread mainThread] withObject:screenImage waitUntilDone:NO];

【问题讨论】:

  • 如果不执行选择器replaceImage,它会崩溃吗?我认为您的 screenImage 在选择器在其他线程上执行之前发布。
  • 我没有在没有选择器的情况下尝试过 - 这个错误很少发生,如果没有这个选择器,我无法真正长时间测试应用程序。至于发布,我认为我可以在使用 imageref 创建 UIImage 后立即执行此操作。不是这样吗?
  • 如果很少,那么 screenImage 会在 replaceImage 选择器之前释放

标签: ios multithreading uikit uiimage


【解决方案1】:

试试这个,它会阻止screenImage被释放

CGImageRef imageRef = CGImageCreate(serverInit.rfbWidth,serverInit.rfbHeight,bitsPerComponent,bitsPerPixel,bytesPerRow,colorSpaceRef,bitmapInfo,provider,NULL,NO,renderingIntent);
    screenImage = [UIImage imageWithCGImage:imageRef];
    CFRelease(imageRef);
dispatch_sync(dispatch_get_main_queue(), ^{
   [view replaceImage:screenImage];
});

【讨论】:

  • 谢谢我已经相应地更改了我的代码 - 将在接下来的几天内观察,如果我没有再次遇到崩溃,会将其标记为正确答案。不过要重申我最初的问题,是否可以使用以下行:screenImage = [UIImage imageWithCGImage:imageRef];在后台线程中?
  • 为什么不呢?你在其他地方用过吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-30
  • 1970-01-01
  • 2022-11-01
  • 2019-05-17
  • 1970-01-01
  • 2011-06-07
  • 1970-01-01
相关资源
最近更新 更多