您好,登錄后才能下訂單哦!
IOS 多個(gè)UIImageView 加載高清大圖時(shí)內(nèi)存管理
當(dāng)我們?cè)谀骋粋€(gè)View 多個(gè)UIImageView,且UIImageView都顯示的是高清大圖,就有可能出現(xiàn)內(nèi)存警告的問(wèn)題。如果第一次進(jìn)入這個(gè)view,沒(méi)有發(fā)生內(nèi)存警告,當(dāng)再次進(jìn)入這個(gè)view,如果上一次的內(nèi)存沒(méi)有及時(shí)釋放,這一次次的累加,便可導(dǎo)致內(nèi)存崩潰。
1,UIImage 加載圖片的方式。
如果是本地圖片,盡量不要使用 [UIImage p_w_picpathNamed:nil]; 這種方式,如果使用這種方式加載,只要程序不退出,它便一直會(huì)在內(nèi)存中。
我們可以使用 :
NSString *path = [[NSBundlemainBundle]pathForResource:@'"圖片的名字" ofType:@""];
UIImage *p_w_picpath = [UIImagep_w_picpathWithContentsOfFile:path];
那兩者的優(yōu)缺點(diǎn)就很明顯了,[UIImage p_w_picpathNamed:nil]; 只需加載一次,它便在內(nèi)存中,所以第二次加載速度很快。而第二種加載方式由于我們將它釋放掉了,會(huì)再次加載。所以選用那種方式,依你情況而定。
2,上面說(shuō)的第二種方式,雖然可以釋放掉,但我們要告訴人家什么時(shí)候釋放。也就是說(shuō),當(dāng)前顯示頁(yè)面不是這個(gè)view時(shí),我們便將它釋放掉:
- (void)viewWillDisappear:(BOOL)animated{
[UIImageView removeFromSuperview];
UiImageView = nil;
}
當(dāng)然,當(dāng)我們?cè)俅芜M(jìn)入這個(gè)view時(shí),便要將移除掉的view再次添加進(jìn)來(lái)
- (void)viewDidAppear:(BOOL)animated{
[self addSubView:UIImageView];
}
3,上述兩種方式,主要解決內(nèi)存累加的問(wèn)題。但如果第一次進(jìn)入view,圖片全部渲染在view上時(shí),內(nèi)存就崩潰了。那我們只能在圖片上做文章了。我們加載的高清大圖如果差不多都是3000*2000,也可能比這個(gè)還大,就算我們的程序是iPad App,iPad 4 的分辨率才多少,這些圖遠(yuǎn)遠(yuǎn)大于設(shè)備的分辨率,完全是資源浪費(fèi),所以我們通常的一個(gè)做法,便是將這樣的圖以小尺寸渲染到view上。
推薦使用:
UIImage+Resize.h, UIImage+Resize.m
Extends the UIImage class to support resizing (optionally preserving the original aspect ratio), cropping, and generating thumbnails.
UIImage+RoundedCorner.h, UIImage+RoundedCorner.m
Extends the UIImage class to support adding rounded corners to an p_w_picpath.
UIImage+Alpha.h, UIImage+Alpha.m
Extends the UIImage class with helper methods for working with alpha layers (transparencies).
常用方法:
UIImage *p_w_picpath
UIImage *thumbImage = [p_w_picpaththumbnailImage:140// This should the size of the view in collection view. example: myCell width is 20 and height is 20.
transparentBorder:0
cornerRadius:0
interpolationQuality:kCGInterpolationMedium]; //生成縮略圖
// this "resizedp_w_picpath" p_w_picpath is what you want to pass to setImage
UIImage * resizedImage = [p_w_picpathresizedImage:p_w_picpathview.frame.sizeinterpolationQuality:kCGInterpolationLow]; //生成你想要尺寸的圖
造成的問(wèn)題,要注意縮放的比例,不要導(dǎo)致圖片變形,由于尺寸縮小,可能會(huì)導(dǎo)致圖片模糊,注意縮小的尺寸。
綜上可見(jiàn),每種方法有優(yōu)點(diǎn),有缺點(diǎn)。主要依據(jù)自己的開(kāi)發(fā)情況,折中使用。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。