Ios NSData映像在内存中的权重是否与打开的映像相同?

Ios NSData映像在内存中的权重是否与打开的映像相同?,ios,objective-c,cocoa-touch,memory-management,Ios,Objective C,Cocoa Touch,Memory Management,我正在从iOS应用程序向服务器上传功能。我现在正在设计实现这一点的最佳方法,并认为我的方法会遇到麻烦 我有20多张图片,我想使用AFmultiparFormData在AFNetworking中的AFmultiparFormData以及与该图片相关的文本信息在一个请求中发送 现在。。。我知道如何创建包含大量信息的NSDictionary,但从未创建过包含20幅图像的NSData格式的NSDictionary,也从未尝试一次上载多张图片 问题是,我不知道NSData图像是否会占用与图像相同的内存空间

我正在从iOS应用程序向服务器上传功能。我现在正在设计实现这一点的最佳方法,并认为我的方法会遇到麻烦

我有20多张图片,我想使用
AFmultiparFormData
AFNetworking
中的
AFmultiparFormData
以及与该图片相关的文本信息在一个请求中发送

现在。。。我知道如何创建包含大量信息的
NSDictionary
,但从未创建过包含20幅图像的
NSData
格式的
NSDictionary
,也从未尝试一次上载多张图片

问题是,我不知道
NSData
图像是否会占用与图像相同的内存空间。因此,我当时只能做2/3(如果它们不是全屏图像,但只是任意测量点)

考虑到我所说的和下面的seudo代码,我可以这样做吗?还是内存不足?否则我就只能一个接一个地做了

// for loop that does this 20 times
UIImage* image = [UIImage imageNamed:myExercise.exercisePictureThumb];
NSData * exercisePictureThumb = UIImagePNGRepresentation(image1);

// add to dictionary recursively

您不应该将所有图像数据放入
NSDictionary
,因为这可能会导致内存问题


相反,创建一个指向文件的URL字典或数组,然后使用AFNetworking和,尤其是
appendPartWithFileURL:name:fileName:mimeType:error:
。通过这种方式,所有图像的图像数据不是一次性全部存储在内存中,而是从磁盘流式传输。性能大幅提升。

MishieMoo在内存/流媒体方面的考虑是绝对正确的,明智的建议是避免将所有图像一次加载到内存中

我想回到你的
UIImage
vs
NSData
问题上来。在我看来,有两个考虑:

  • 文件大小:不幸的是,对于原始图像是否会小于
    UIImage
    /
    UIImagePNGRepresentation
    输出,没有简单的答案。有时,如果原始文件是JPEG,则通过
    UIImage
    对图像进行往返操作的结果实际上会使文件变大(例如,我刚刚抓取了三张图像,PNG往返操作将它们从4.7mb增加到38.9mb)。但是,如果原始图像是未压缩的图像,那么PNG往返可能会使它们变得更小

  • 数据丢失:对我来说,通过
    UIImage
    往返图像更重要的问题是,您将遭受数据丢失。你会丢失元数据。根据图像的不同,您甚至可能在翻译过程中丢失图像数据(例如,如果原始图像不在sRGB颜色空间中,如果位深度降低,等等)


  • 现在,有时它非常有意义(例如,我在创建图像缩略图时使用了这种
    UIImage
    往返技术的变体)。但是,如果我的目的是将图像上传到服务器上,我会非常小心通过
    UIImage
    转换,可能会丢失数据,而没有令人信服的商业案例。

    正如我所说,我正在设计它。。。测试它意味着实现……制作一个简单的程序,给它提供一些图像,然后看看会发生什么。已经有虚拟内存解决了这个问题,所以我不太关心如何将内容从RAM传输到磁盘,反之亦然。足够在你收到应用程序委派中的内存警告时释放部分内存。更好的方法是小心你的应用程序正在使用的内存量。我曾经遇到过这样的情况,
    没有收到记忆警告
    不足以使应用程序免于被抛弃。如果你能避免在内存中存储20个图像的数据,我会这么说。@MishieMoo所以在fileURL中我放了文件的完整路径?没错。请确保使用
    [NSURL fileURLWithString…]
    创建该文件,否则无法正确读取该文件。@RamyAlZuhouri iOS设备上不会发生虚拟内存交换。因此,在设备上,确保不将图像一次性加载到内存中是一个非常重要的考虑因素。MishieMoo是绝对正确的。