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對象,減少沙盒的讀取操作。