gpt4 book ai didi

crash - 内存泄漏/崩溃转换图像数据

转载 作者:行者123 更新时间:2023-12-03 15:30:49 25 4
gpt4 key购买 nike

以下代码在约 200 次调用后崩溃。我在每次调用后都尝试了 GC,并尝试了另一个 GC 的 MemoryWarning block ,但它仍然崩溃。

public byte[] ConvertImage(string base64String)
{
try
{
byte[] encodedDataAsBytes = Convert.FromBase64String ( base64String );
base64String = "";
NSData data = UIImage.LoadFromData ( NSData.FromArray ( encodedDataAsBytes ) ).AsPNG();
encodedDataAsBytes = null;
Byte[] returnBytes2 = new Byte[data.Length];
System.Runtime.InteropServices.Marshal.Copy
(data.Bytes, returnBytes2, 0, System.Convert.ToInt32(data.Length));
data.Dispose();
return returnBytes2;
}
catch(Exception ex)
{
Log.LogError("ConvertImage", ex);
return null;
}
}

TIA,瑞克

经过 Xamarin Support 的多次头脑 Storm 和极好的帮助后 - 答案是将方法包装在 using (var pool = new NSAutoreleasePool ())

现在一切都很好!哦,还有一点,将 .PNG 更改为 .JPEG 也减少了负载。

最佳答案

这非常占用内存。 base64 stringbyte[] 数组,NSDataUIImage,第二个NSData ,第二个byte[]数组。这是您正在处理的图像所需内存的许多倍。

根据代码的调用方式(例如,对一堆图像的循环),您分配内存的速度可能快于 GC 回收内存的速度。在某些时候,iOS 会触发内存警告(但这在循环中无济于事),如果内存使用量没有迅速减少,它会杀死你。

通过处理代码创建的每个 IDisposable 实例,您可以轻松降低内存需求。现在,您只处理了您创建的两个 NSData 实例之一,而没有处理 UIImage。您可以像这样处理所有这些:

byte[] encodedDataAsBytes = Convert.FromBase64String ( base64String );
using (var nsd1 = NSData.FromArray ( encodedDataAsBytes ))
using (var img = UIImage.LoadFromData ( nsd1 ))
using (NSData data = img.AsPNG ()) {
byte[] returnBytes2 = new byte [data.Length];
Marshal.Copy (data.Bytes, returnBytes2, 0, (int) data.Length);
return returnBytes2;
}

接下来,代码的目的是什么?也就是说,您要对包含 PNG 图像的 byte[] 做什么?它本身不是很有用,但如果您只是将它保存到磁盘,那么您可以从 NSData 执行此操作并跳过最后的 byte[] 分配。

也可以应用其他依赖于用法的技巧(例如,尽可能重用第二个 byte[] 缓冲区),但我们需要更多地了解代码的使用方式。

关于crash - 内存泄漏/崩溃转换图像数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12983727/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com