繁体   English   中英

UIImage的线程安全性

[英]Thread safety of UIImage

我知道Apple正式建议UIKit仅用于主线程。 但是,我也听说过自iOS 4.0以来UIImage是线程安全的。 我找不到支持此声明的任何文档。

有没有人有任何信息来支持这种说法? 作为用于存储数据和解码图像数据的类,如果设计良好,UIImage应该是线程安全的。

直接来自Apple的UIImage文档

图像对象是不可变的,因此您无法在创建后更改其属性。 这意味着您通常在初始化时指定图像的属性,或者依赖图像的元数据来提供属性值。 它还意味着图像对象本身可以安全地从任何线程使用。 更改现有图像对象属性的方法是使用一种可用的便捷方法来创建图像的副本,但具有所需的自定义值。

(强调我的)

因此,至少在截至2014年5月13日的当前版本的SDK中,“图像对象本身可以安全地从任何线程使用”。

确实,Apple建议在主线程上使用UIKIt中的元素:

注意:在大多数情况下,UIKit类只能从应用程序的主线程中使用。 对于从UIResponder派生的类或者涉及以任何方式操纵应用程序的用户界面的类尤其如此。

由于UIImage不是从UIResponder派生的,因此您实际上并未在界面/屏幕上显示它。 然后在另一个线程上使用UIImages进行操作应该是安全的。

这是基于我的经验,我没有看到任何关于它的官方文件。

iOS的新功能:iOS 4.0发行说明中,UIKit Framework增强功能包括以下内容:

在UIKit中绘制图形上下文现在是线程安全的。 具体来说:用于访问和操作图形上下文的例程现在可以正确处理驻留在不同线程上的上下文。 字符串和图像绘制现在是线程安全的。 现在可以安全地使用多个线程中的颜色和字体对象。

所以UIImage在iOS 4.0及更高版本上是线程安全的。

看起来Apple已经更新了他们的文档,因为这里的早期答案已经发布。 根据最新的文档,从任何线程创建和使用UIImage实例是安全的:

由于图像对象是不可变的,因此在创建后无法更改其属性。 使用附带图像文件或图像数据中的元数据自动设置大多数图像属性。 图像对象的不可变特性也意味着它们可以安全地从任何线程创建和使用

https://developer.apple.com/reference/uikit/uiimage

只是简而言之:UIImage不是线程安全的,或者更好只适用于主线程,正如我在调试后的经验中所经历的那样。

我希望有所帮助。 我希望从Apple或更好的UIImage类中更清楚地了解这一点,可以在不同的线程中呈现。 不应该太难......

编辑:经过一番研究,我发现它是“UIGraphicsGetImageFromCurrentImageContext();” 这会引起麻烦。 这有点偏离主题,但也许这会有所帮助: https//coderwall.com/p/9j5dca

感谢Zachary Waldowski。

线程安全不是问题,因为任何线程都可以尝试同时访问上下文(并发)。 而且,虽然这通常没问题,但在内存不足的情况下,例如iOS设备上的照片编辑扩展,访问一个上下文的两个线程可能会因内存不足而导致应用程序崩溃。

将Core Image过滤器与vImage操作混合时会发生这种情况。 两者都是线程安全的,但ARC在处理Core Image对象之前不会释放vImage缓冲区数据,所以在某些时候你在内存中有两个图像副本。

因此,在不了解线程和并发性的情况下,您永远不会认为您的线程安全知识是完整的 - 对于线程安全问题的任何答案,这都是双重的。 简而言之:正确的问题是,无论何时谈论图像处理,线程安全如何应用于内存使用。

如果你只是在这里踢轮胎,你需要等到提出你的问题,直到遇到真正的问题。 但是,如果您计划下一步,您需要知道如何按顺序执行图像处理命令,以及手动释放。 您必须设计应用程序,以便在内存中只处理一个正在处理的图像副本。 永远不要依赖自动释放 - 线程安全或不 - 为您打电话。 不起作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM