美文网首页
IOS - 图片加载

IOS - 图片加载

作者: 囧rg | 来源:发表于2016-07-28 13:53 被阅读143次

    一、加载图片的几种方法

    1.用imageNamed方法

    [UIImage imageNamed:ImageName];
    

    利用它可以方便加载资源图片。用imageNamed的方式加载时,会把图像数据根据它的名字缓存在系统内存中,以提高imageNamed方法获得相同图片的image对象的性能。即使生成的对象被 autoReleasePool释放了,这份缓存也不释放。而且没有明确的释放方法。如果图像比较大,或者图像比较多,用这种方式会消耗很大的内存。

    2.用 imageWithContentsOfFile 方法

    NSString *thumbnailFile = [NSString stringWithFormat:@"%@/%@.png", [[NSBundle mainBundle] resourcePath], fileName];UIImage *thumbnail = [UIImage imageWithContentsOfFile:thumbnailFile];
    

    利用这种方法加载的图片是不会缓存的。得到的对象时autoRelease的,当autoReleasePool释放时才释放。

    3.用initWithContentsFile方法

    UIImage *image = [[UIImage alloc] initWithContentsOfFile:filePath];
    

    利用这种方法要手动release掉。不系统缓存。release后立即释放,一般用在封面等图比较大的地方。

    二、方法实现(分类)

    .h文件

    #import <UIKit/UIKit.h>
    
    @interface UIImage (JooImage)
    
    +(UIImage*)JooImageNamed: (NSString*)imageName;
    
    @end
    

    .m文件

    
    #import "UIImage+JooImage.h"
    #import <objc/runtime.h>
    #import <objc/message.h>
    
    @implementation UIImage (JooImage)
    
    // load 在初始化类时调用,每个类都有一个load 方法,
    // 类的初始化先于对象
    +(void)load
    {
        //以下方法就告诉系统用后面的方法替换前面的
        method_exchangeImplementations(class_getClassMethod(self, @selector(imageNamed:)),
                                       class_getClassMethod(self, @selector(myImageNamed:)));
    }
    
    +(UIImage*)JooImageNamed:(NSString *)imageName
    {
        // 图片要支持jpg 和png
        NSString *path = [[NSBundle mainBundle] pathForResource:imageName ofType:@"png"];
        
        if (path == nil)
        {
            path = [[NSBundle mainBundle] pathForResource:imageName ofType:@"jpg"];
        }
        
        // 这里image 在回收后不会占用cash 内存
        UIImage *image = [UIImage imageWithContentsOfFile:path];
        
        return image;
    }
    
    @end
    

    相关文章

      网友评论

          本文标题:IOS - 图片加载

          本文链接:https://www.haomeiwen.com/subject/heeajttx.html