Официально UIKit не является потокобезопасным (хотя, по-моему, он стал немного безопаснее в iOS 4), поэтому не следует вызывать ни один из методов UIImage в фоновом потоке.На практике я думаю, что вы склонны не сталкиваться с проблемами, если вы не делаете ничего, что заставляет объект UIKit захотеть перерисовать, но это правило большого пальца, на которое вы никогда не должны полагаться в отгрузочном коде - я упоминаю это просто, чтобы объяснить, почемуу вас, вероятно, не было проблем.
Как вы заметили, CGImageRefs (в том числе и в оболочке UIImage) продолжают ссылаться на исходные изображения в их закодированной форме до тех пор, пока кто-то не нуждается в их декодировании.«Уловка», которую вы цитируете, эффективна для запуска декодирования;Лучшее решение - полностью избежать UIImage, пока вы не вернетесь в основной поток, начните с CGImageCreateWithJPEGDataProvider, создайте отдельный контекст, как вы делали выше, CGContextDrawImage из JPEGDataProvider в новый контекст, а затем передайте новый контекст какimage, освобождая поставщика данных JPEG.
Что касается ImageIO_BGR_A_TO_RGB_A_8Bit, возможно, стоит дать CGColorSpaceCreateDeviceRGB () вместо CGImageGetColorSpace (cgImage), чтобы получить контекст с цветовым пространством, которое не зависитв файле исходного изображения внизу.