當前位置:成語大全網 - 新華字典 - iOS開發中加載圖片的內存問題以及優化方案

iOS開發中加載圖片的內存問題以及優化方案

圖片的加載方式 iOS 目前有2種:

1.Resource 它是指inageWithContentsFile:創建圖片的圖片管理方式;

2.ImageAssets 它是指使用imageNamed:創建圖片的圖片的管理方式;

UIImage內存處理:

真是的App開發中,常用的無非是1和2兩種方式

1的優缺點:

1的使用方式:NSString *path =[[NSBundle mainBundle]pathForResource:@"image@2x" type:@"png"];

UIImage *image = [UIImage imageWithContentsOfFile:path];

1的內部實現方式:+ (instancetype)imageWithContentsOfFile:(NSString *)fileName {

NSUInteger scale = 0;

{

scale = 2;//這壹部分是提取fileName中@號後面的那個數字,如果存在則為1

}

return [[self alloc] initWithData:[NSData dataWithContentsOfFile:fileName scale:scale]];

}

這種方式使用的時候會有個局限性,這個圖片必須是在.ipa的根目錄或者沙盒中。根目錄就是把圖片文件拖到工程中,沙盒中的圖片是寫入進去或者存進去的;

1的特性:在1的圖片管理方式中,所有的圖片創建都是通過讀取文件數據得到的,讀取壹次文件數據就會產生壹次NSData以及產生壹個UIImage,當圖片創建好後會銷毀對應的NSData,當UIImage的引用計數變為0的時候自動銷毀UIImage,這樣的話就可以保證圖片不會長期存在內存中。

1的使用場景:由於這種方法的特性,所以1得方法壹般用在圖片數據很大,圖片壹般不需要多次使用的情況,比如引導頁面的背景(圖片全屏),有時候運行APP才顯示,有時候根本就用不到。

1的優點:圖片的生命周期可以得到管理,當需要圖片的時候就創建壹個,當不需要圖片的時候就讓他銷毀,圖片不會長期的保存在內存中,因此不會有內存浪費,在減少大圖的內存占用中,1方式優先。

2的方式:2的設計初衷主要是為了解決自動適配Retian屏和非Retian屏,也就是說為了解決iPhone4和iPhone3GS以及以前的機型的屏幕適配,雖然沒有3GS了,但是plus出來了,需要3x

2的使用方式:UIImage *image = [UIImage imageName:@"image"];

2的特性:與1相似,2也是從圖片文件中讀取圖片數據轉化成UIImage,只不過這些圖片都打包在2中,最大的區別就是圖片有緩存。相當於與壹個字典,key是圖片名,value是圖片對象。調用imageNamed:方法的時候先從這個字典中去取,如果取到就直接返回,如果娶不到再去文件中創建,然後保存在這個字典中。由於字典的key和value都是強引用,所以壹旦創建後的圖片永不銷毀。

2的內部實現方式:+(instancetype)imageName:(NSString*)imageName {

if(!imageName)

return nil;

}

UIImage *image = self.imageBuff[imageName];

if(image){

return image;

}

NSString *path = @"image Path";

image = [UIImage imageNamed: ?];

if(image){

self.imageBuff[imageName] = image;

}

return image;

}

+ (NSMutableDictionary*)imageBuff {

static NSMutableDictionary *_imageBuff;

static dispatch_once_t onceToken;

dispatch_once(&onceToken,^{

_imageBuff = [[NSMutableDictionary alloc]init];

});

return _imageBuff;

}

2的使用場景:最主要的使用場景就是icon類的圖片,壹般的icon類的圖片大小在3kb到20kb不等,都是壹些小文件

2的優點:當壹個icon在多個地方需要被顯示的時候,其對應的UIImage對象只會被創建1次,而且多個地方的icon都將會***用壹個UIImage對象,減少沙盒的讀取操作。