Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 在4.0版本之前的iOS中,是否有线程安全的方法来创建PNG图像?_Iphone_Objective C_Ipad_Png_Ios - Fatal编程技术网

Iphone 在4.0版本之前的iOS中,是否有线程安全的方法来创建PNG图像?

Iphone 在4.0版本之前的iOS中,是否有线程安全的方法来创建PNG图像?,iphone,objective-c,ipad,png,ios,Iphone,Objective C,Ipad,Png,Ios,我很肯定 UIImagePNGRepresentation([UIImage imageWithCGImage:imageRef]) 是在后台线程中执行时导致随机内存泄漏的原因。它导致可追溯到CGContextDrawPDFPage!的泄漏 现在,互联网上的其他地方都说我应该使用CGImageDestination,它在iOS4之前是不可用的。除了导入重量级PNG库之外,还有其他方法可以将位图编码为PNG吗 编辑:现在这很有趣。对于创建PNG的整个后台线程,我每生成10个PNG,就会耗尽自动释

我很肯定

UIImagePNGRepresentation([UIImage imageWithCGImage:imageRef])
是在后台线程中执行时导致随机内存泄漏的原因。它导致可追溯到CGContextDrawPDFPage!的泄漏

现在,互联网上的其他地方都说我应该使用CGImageDestination,它在iOS4之前是不可用的。除了导入重量级PNG库之外,还有其他方法可以将位图编码为PNG吗

编辑:现在这很有趣。对于创建PNG的整个后台线程,我每生成10个PNG,就会耗尽自动释放池。内存警告和崩溃消失后,我添加了一个自动释放池周围的保存。这些调用是否需要内存

NSAutoreleasePool* savePool = [[NSAutoreleasePool alloc] init];

NSData* imageData = UIImagePNGRepresentation([UIImage imageWithCGImage:imageRef]);
[imageData writeToFile:savePath atomically:NO];

[savePool drain];
实际上,

UIImageXXXRepresentation([UIImage imageWithCGImage:imageRef])
看起来是线程安全的。注意内存的使用。

在实践中

UIImageXXXRepresentation([UIImage imageWithCGImage:imageRef])

看起来是线程安全的。请注意mem的使用。

我使用UIImageJPGRepresentation,我知道它的PNG,您在单独的线程中使用得非常密集,没有任何问题。您确定问题不是来自可以在其他线程中写入的imageReg吗?CGImageRef是在执行UIImagePngResentation的同一线程中生成的,我不会与任何其他线程共享它。编辑了主要问题:在保存代码周围包装自动释放池将删除内存警告和崩溃看起来这两行代码分配了太多内存,你不能让它们长时间不发布。我使用UIImageJPGRepresentation,我知道它的PNG,你在一个单独的线程中大量使用,没有任何问题。您确定问题不是来自可以在其他线程中写入的imageReg吗?CGImageRef是在执行UIImagePngResentation的同一线程中生成的,我不会与任何其他线程共享它。编辑了主要问题:在保存代码周围包装自动释放池将删除内存警告和崩溃看起来这两行代码分配了太多内存,您不能让它们长时间不发布。@从iOS 4开始,绘制图形上下文的Bill UIKit函数就一直是线程安全的。@sobri这不是一个绘制函数。这是一个编码函数。虽然这些编码函数没有理由是线程不安全的,但我仍然找不到在后台线程中使用此函数的安全性线索。请让我知道如果你有一个…@Eonil我已经在后台线程广泛使用它。这样做是安全的,只要输入数据没有在线程之外被修改。这将是一个普通的线程编程错误,而不是特定于此API。@sobri您真的认为您的个人经验可以作为提供线程安全的线索吗?@Eonil,是的,绝对可以,考虑到代码已经在成千上万的设备上运行。坦率地说,这是科学的。即使没有这一点,很明显UIImageXXXRepresentation函数本身也没有任何理由不保证线程安全。它们接受输入变量,解释它们而不是对它们进行变异,并生成输出变量。如果它们不是线程安全的,那将是一个bug。@从iOS 4开始,绘制到图形上下文的Bill UIKit函数就一直是线程安全的。@sobri这不是一个绘制函数。这是一个编码函数。虽然这些编码函数没有理由是线程不安全的,但我仍然找不到在后台线程中使用此函数的安全性线索。请让我知道如果你有一个…@Eonil我已经在后台线程广泛使用它。这样做是安全的,只要输入数据没有在线程之外被修改。这将是一个普通的线程编程错误,而不是特定于此API。@sobri您真的认为您的个人经验可以作为提供线程安全的线索吗?@Eonil,是的,绝对可以,考虑到代码已经在成千上万的设备上运行。坦率地说,这是科学的。即使没有这一点,很明显UIImageXXXRepresentation函数本身也没有任何理由不保证线程安全。它们接受输入变量,解释它们而不是对它们进行变异,并生成输出变量。如果它们不是线程安全的,那将是一个bug。