imageWithContentsOfFile内存问题

时间:2015-05-14 06:41:09

标签: ios objective-c memory-management uiimage

我的项目有图像共享功能。在此功能中,我的应用程序会询问用户您要共享的库。

我在下面编写了代码来分配图像,从默认库/自定义库中检索。

  • 设备默认库

    imgVwMediaFile.image = [UIImage imageWithCGImage:[asset thumbnail]; //(ALAsset *)资产

  • 自定义库(图像位于Documents / image / user)

    imgVwMediaFile.image = [UIImage imageWithContentsOfFile:path];        //(的NSString *)路径

应用程序在具有自定义单元格的集合视图中显示此图像。

当我选择应用程序自定义库时,图像将从Documents目录中检索,但 imagewithcontentofFile 耗费大约90到100 Mb的内存。

在其他情况下,当我选择应用程序默认的libray时,它不会消耗超过8或10 Mb的内存。

我尝试了来自堆栈Q / A的不同代码用于自定义库,但仍存在内存问题。

-1-
CGImageRef iref = [[UIImage imageNamed:asset] CGImage] ;
imgVwMediaFile.image=[UIImage  imageWithCGImage:iref];
iref=nil

-2-
NSData *imageData = [[NSData alloc] initWithContentsOfFile:path];
imgVwMediaFile.image=[UIImage imageWithData:imageData];
imageData=nil

-3-
imgVwMediaFile.image=[UIImage imageNamed:path];

所以请指导我,如何从文档目录中加载图像?

在不增加内存负载的情况下从文档目录加载图像的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

问题是您保存到磁盘的图像很大,因此加载大量的图像会显示在集合中会占用大量内存。您可以使用内置库中的缩略图,以便看到不同的结果。

理想情况下,您可以在自定义库中保存缩略图文件夹并显示它们,然后,在选择图像时,获取相应的完整尺寸图像(这是所有照片库使用的方法)。或者你可以动态调整图像的大小,但你的滚动基本上可以保证很糟糕。

答案 1 :(得分:-1)

// abstract class
abstract class A
    {
        public abstract void MethodOne();
    }

// class B inherits A
class B : A
{
    public override void MethodOne()
    {
        Console.WriteLine("From Class B");
    }
}

// class C inherits B
class C : B
{
    public override void MethodOne()
    {
        Console.WriteLine("From Class C");
    }
}

// class D inherits C
class D : C
{
    public override void MethodOne()
    {
        Console.WriteLine("From Class D");
    }
}

// etc......

// class Main method Class

class MainClass
{
    public static void Main()
    {
        B[] TestArray = new B[3];
        B b1 = new B();
        C c1 = new C();
        D d1 = new D();

        TestArray[0] = b1;
        TestArray[1] = c1;
        TestArray[2] = d1;

        for (int i = 0; i < TestArray.Length; i++)
        {
            TestArray[i].MethodOne();
        }

        Console.ReadLine();
    }
}