? ? ? ?首先,我們要考慮的就是對資源文件的延遲加載。由于資源文件的訪問涉及IO操作,這本身就會耗費一定的 CPU時間,如果文件比較大而且加載時機又不合適,就會造成內存浪費。無論是什么類型的文件,有些情況下采用延遲加載是很有必要的。?
如圖1所示的需求,南昌APP開發公司小編認為可以使用分屏控件(UIPageControl)左右滑動屏幕來瀏覽這3張圖片。
圖1 圖片延遲加載實例?
? ? ? ?class ViewController: UIViewController, UIScrollViewDelegate {?
? ? ? ?var page1 : UIImageView! ??
? ? ? ?var page2 : UIImageView! ? ??
? ? ? ?var page3 : UIImageView!?
? ? ? ?@IBOutlet weak var scrollView: UIScrollView! ? ?
? ? ? ?@IBOutlet weak var pageControl: UIPageControl!?
? ? ? ?override func viewDidLoad() { ? ? ? ??
? ? ? ?super.viewDidLoad() ? ? ? ? ? ? ? ? ?
? ? ? ?self.scrollView.delegate = self ? ? ? ? ? ? ? ? ?
? ? ? ?self.scrollView.contentSize ? ? ? ? ? ? ?
? ? ? ?= CGSizeMake(self.view.frame.size.width*3, self.scrollView. ? ? ? ? ? ??
? ? ? ?frame.size.height) ? ? ? ??
? ? ? ?self.scrollView.frame = self.view.frame ? ? ? ? ? ? ? ? ?
? ? ? ?var mainStoryboard = self.storyboard! ? ? ? ? ? ? ? ? ?
? ? ? ?self.page1 = UIImageView(image: UIImage(named: "達芬奇-蒙娜麗莎.png")) ? ? ? ?
? ? ? ?self.page1.frame = CGRectMake(0.0, 0.0, 320.0, 480.0) ? ? ? ? ??
? ? ? ?self.page2 = UIImageView(image: UIImage(named: "羅丹-思想者.png")) ? ? ? ??
? ? ? ?self.page2.frame = CGRectMake(320.0, 0.0, 320.0, 480.0) ? ? ? ? ? ? ? ? ?
? ? ? ?self.page3 = UIImageView(image: UIImage(named: "保羅克利-肖像.png")) ? ? ? ?
? ? ? ?self.page3.frame = CGRectMake(2 * 320.0, 0.0, 320.0, 480.0) ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ?self.scrollView.addSubview(page1) ? ? ? ??? ?
? ? ? ?self.scrollView.addSubview(page2) ? ? ? ??
? ? ? ?self.scrollView.addSubview(page3)
? ? ? ?#import "ViewController.h" ?
? ? ? ?@interface ViewController ()
? ? ? ?@property (strong, nonatomic) UIImageView *page1;?
? ? ? ?@property (strong, nonatomic) UIImageView *page2;?
? ? ? ?@property (strong, nonatomic) UIImageView *page3; ?
? ? ? ?@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;?
? ? ? ?@property (weak, nonatomic) IBOutlet UIPageControl *pageControl; ?
? ? ? ?- (IBAction)changePage:(id)sender; ?
? ? ? ?@end ?
? ? ? ?@implementation ViewController ?
? ? ? ?- (void)viewDidLoad?
? ? ? ?{ ? ??
? ? ? ? [
? ? ? ?super viewDidLoad]; ? ? ? ? ?? ? ? ?self.scrollView.delegate = self; ? ? ? ??
? ? ? ?self.scrollView.contentSize ? ? ? ? ??
? ? ? ?= CGSizeMake(self.view.frame.size.width*3, ? ? ?
? ? ? ?self.scrollView.frame.size.height); ? ??
? ? ? ?self.scrollView.frame = self.view.frame; ? ? ? ? ? ? ?
? ? ? ?self.page1 = [[UIImageView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, ? ? ? ? ?
? ? ? ?self.view.frame.size.width, self.view.frame.size.height)]; ? ??
? ? ? ?self.page1.image = [UIImage imageNamed:@"達芬奇-蒙娜麗莎.png"]; ? ? ? ? ?? ? ? ?self.page2 = [[UIImageView alloc] initWithFrame:CGRectMake(320.0f, 0.0f, ? ? ? ??
? ? ? ?self.view.frame.size.width, self.view.frame.size.height)]; ? ?
? ? ? ?self.page2.image = [UIImage imageNamed:@"羅丹-思想者.png"];?? ? ? ?} ?
? ? ? ?override func didReceiveMemoryWarning() { ? ? ? ??
? ? ? ?super.didReceiveMemoryWarning() ? ??
? ? ? ?} ?
? ??
? ? ? ?func scrollViewDidScroll(scrollView: UIScrollView) { ? ? ? ??
? ? ? ?var offset = scrollView.contentOffset ? ? ? ??
? ? ? ?self.pageControl.currentPage = Int(offset.x) / 320 ? ??
? ? ? ?} ? ? ? ? ?
? ? ? ?@IBAction func changePage(sender: AnyObject) { ? ? ? ??
? ? ? ?UIView.animateWithDuration(0.3,animations : { ? ? ? ? ? ??
? ? ? ?var whichPage = self.pageControl.currentPage ? ? ? ? ? ??
? ? ? ?self.scrollView.contentOffset = CGPointMake ? ? ? ? ? ? ? ??
? ? ? ?(320 * CGFloat(whichPage), 0) ? ? ? ??
? ? ? ?}) ? ?
? ? ? ?}?
? ? ? ?}?
? ? ? ?self.page3 = [[UIImageView alloc] initWithFrame:CGRectMake(2 * 320.0f, 0.0f, ? ? ? ??
? ? ? ?self.view.frame.size.width, self.view.frame.size.height)]; ? ??
? ? ? ?self.page3.image = [UIImage imageNamed:@"保羅克利-肖像.png"]; ? ? ? ? ?? ? ? ?[self.scrollView addSubview:self.page1]; ? ??
? ? ? ?[self.scrollView addSubview:self.page2]; ? ??
? ? ? ?[self.scrollView addSubview:self.page3];?
? ? ? ?} ?
?
? ? ? ?- (void) scrollViewDidScroll: (UIScrollView *) aScrollView?
? ? ? ?{ ? ??
? ? ? ?CGPoint offset = aScrollView.contentOffset; ? ??
? ? ? ?self.pageControl.currentPage = offset.x / 320.0f;?
? ? ? ?} ??
? ? ? ?- (void)didReceiveMemoryWarning?
? ? ? ?{ ? ??
? ? ? ?[super didReceiveMemoryWarning];?
? ? ? ?} ?
? ? ? ?#pragma mark - ?
? ? ? ?#pragma mark PageControl stuff?
? ? ? ?- (IBAction)changePage:(id)sender?
? ? ? ?{ ? ??
? ? ? ?[UIView animateWithDuration:0.3f animations:^{ ? ? ? ??
? ? ? ?NSInteger whichPage = self.pageControl.currentPage; ? ? ? ??
? ? ? ?self.scrollView.contentOffset = CGPointMake(320.0f * whichPage, 0.0f); ? ?
? ? ? ?}];?
? ? ? ?} ?
? ? ? ?@end
? ? ? ?我們是在viewDidLoad方法中一次加載全部3張圖片,但是有的時候用戶不一定會瀏覽后面的圖片,他可能只看 到第一張或第二張,后面的第三張沒有去看,此時后面的兩張圖片仍然加載內存的話,會造成內存浪費。?
? ? ? ?這時候我們就可以采用資源文件的延遲加載功能,采用延遲加載實現時,ViewController的代碼如下:?
? ? ? ?class ViewController: UIViewController, UIScrollViewDelegate { ?
? ? ? ?var page1 : UIImageView! ? ??
? ? ? ?var page2 : UIImageView! ? ??
? ? ? ?var page3 : UIImageView! ? ? ? ? ?
? ? ? ?@IBOutlet weak var scrollView: UIScrollView! ? ??
? ? ? ?@IBOutlet weak var pageControl: UIPageControl! ? ? ? ? ?
? ? ? ?override func viewDidLoad() { ? ? ? ??
? ? ? ?super.viewDidLoad() ? ? ? ? ? ? ? ? ?
? ? ? ?self.scrollView.delegate = self ?
? ? ? ? ? ? ? ??
? ? ? ?self.scrollView.contentSize ? ? ? ? ? ? ??
? ? ? ?= CGSizeMake(self.view.frame.size.width*3, self.scrollView. ? ? ? ? ? ??
? ? ? ?frame.size.height) ? ? ? ??
? ? ? ?self.scrollView.frame = self.view.frame ? ? ? ? ? ? ? ? ?
? ? ? ?var mainStoryboard = self.storyboard! ? ? ? ? ? ? ? ? ?
? ? ? ?self.page1 = UIImageView(image: UIImage(named: ? ? ? ? ? ??
? ? ? ?"達芬奇-蒙娜麗莎.png")) ? ? ? ? ? ? ? ? ? ? ? ?① ? ? ? ?
? ? ? ?self.page1.frame = CGRectMake(0.0, 0.0, 320.0, 480.0) ? ? ? ? ? ? ? ? ?
? ? ? ?self.scrollView.addSubview(page1) ? ? ? ? ? ? ?
? ? ? ?}?? ? ? ?#import "ViewController.h" ?
? ? ? ?@interface ViewController ()
? ? ? ?@property (strong, nonatomic) UIImageView *page1;?
? ? ? ?@property (strong, nonatomic) UIImageView *page2;?
? ? ? ?@property (strong, nonatomic) UIImageView *page3;?
?
? ? ? ?@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;?
? ? ? ?@property (weak, nonatomic) IBOutlet UIPageControl *pageControl; ?
? ? ? ?- (IBAction)changePage:(id)sender; ?
? ? ? ?-(void)loadImage:(NSInteger)nextPage; ?
? ? ? ?@end ?
? ? ? ?@implementation ViewController ?
? ? ? ?- (void)viewDidLoad?
? ? ? ?{ ? ??
? ? ? ?[super viewDidLoad]; ? ? ? ? ?
? ? ? ?self.scrollView.delegate = self; ? ? ? ? ?
? ? ? ?self.scrollView.contentSize ?= CGSizeMake(self.view.frame.size.width*3, ? ? ? ??
? ? ? ?self.scrollView.frame.size.height); ? ?
? ? ? ?self.scrollView.frame = self.view.frame;?? ? ? ?override func didReceiveMemoryWarning() { ? ? ? ??
? ? ? ?super.didReceiveMemoryWarning() ? ??
? ? ? ?} ?
? ? ? ?func scrollViewDidScroll(scrollView: UIScrollView) { ? ? ? ??
? ? ? ?var offset = scrollView.contentOffset ? ? ? ??
? ? ? ?self.pageControl.currentPage = Int(offset.x) / 320 ? ? ? ? ? ? ? ? ?
? ? ? ?self.loadImage(self.pageControl.currentPage + 1) ? ? ? ? ? ? ?
? ? ? ?} ? ? ? ? ?
? ? ? ?@IBAction func changePage(sender: AnyObject) { ? ? ? ??
? ? ? ?UIView.animateWithDuration(0.3,animations : { ? ? ? ? ? ??
? ? ? ?var whichPage = self.pageControl.currentPage ? ? ? ? ? ??
? ? ? ?self.scrollView.contentOffset = CGPointMake ? ? ? ? ? ? ? ??
? ? ? ?(320 * CGFloat(whichPage), 0) ? ? ? ? ? ??
? ? ? ?self.loadImage(self.pageControl.currentPage + 1) ? ? ? ??
? ? ? ?}) ? ??
? ? ? ?} ? ? ? ? ?
? ? ? ?func loadImage(nextPage: Int) { ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ?if nextPage == 1 && self.page2 == nil { ? ? ? ? ? ??
? ? ? ?self.page2 = UIImageView(image: UIImage(named: "羅丹-思想者.png")) ? ? ? ? ? ??
? ? ? ?self.page2.frame = CGRectMake(320.0, 0.0, 320.0, 480.0) ? ? ? ? ? ??
? ? ? ?self.scrollView.addSubview(page2) ? ? ? ??
? ? ? ?} ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ?if nextPage == 2 && self.page3 == nil { ? ? ? ? ? ??
? ? ? ?self.page3 = UIImageView(image: UIImage(named: "保羅克利-肖像.png")) ? ? ? ? ? ? ? ?
? ? ? ?self.page3.frame = CGRectMake(2 * 320.0, 0.0, 320.0, 480.0) ? ? ? ? ? ??
? ? ? ?self.scrollView.addSubview(page3) ? ? ? ??
? ? ? ?} ? ?? ? ? ?}?
? ? ? ?}?
? ? ? ?self.page1 = [[UIImageView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, ? ? ? ? ?
? ? ? ?self.view.frame.size.width, self.view.frame.size.height)]; ? ??
? ? ? ?self.page1.image = [UIImage imageNamed:@"達芬奇-蒙娜麗莎.png"]; ? ? ? ?① ? ? ? ?
? ? ? ?[self.scrollView addSubview:self.page1];?
? ? ? ?} ?? ? ? ?- (void) scrollViewDidScroll: (UIScrollView *) aScrollView?
? ? ? ?{ ? ??
? ? ? ?CGPoint offset = aScrollView.contentOffset; ? ??
? ? ? ?self.pageControl.currentPage = offset.x / 320.0f; ? ??
? ? ? ?[self loadImage:self.pageControl.currentPage + 1];?
? ? ? ?} ?
? ? ? ?- (void)didReceiveMemoryWarning?
? ? ? ?{ ? ??
? ? ? ?[super didReceiveMemoryWarning];?
? ? ? ?} ?
? ? ? ?#pragma mark - ?
? ? ? ?#pragma mark PageControl stuff?
? ? ? ?- (IBAction)changePage:(id)sender?
? ? ? ?{ ? ??
? ? ? ?[UIView animateWithDuration:0.3f animations:^{ ? ? ? ??
? ? ? ?NSInteger whichPage = self.pageControl.currentPage; ? ? ? ??
? ? ? ?self.scrollView.contentOffset = CGPointMake(320.0f * whichPage, 0.0f); ? ? ? ?
? ? ? ?[self loadImage:self.pageControl.currentPage + 1]; ? ??
? ? ? ?}];?
? ? ? ?} ?
? ? ? ?-(void)loadImage:(NSInteger)nextPage?
? ? ? ?{ ? ??
? ? ? ?if (nextPage == 1 && self.page2 == nil) { ? ? ? ??
? ? ? ?self.page2 = [[UIImageView alloc] initWithFrame:CGRectMake(320.0f, 0.0f, ? ? ? ? ? ?
? ? ? ?self.view.frame.size.width, self.view.frame.size.height)]; ? ? ? ??
? ? ? ?self.page2.image = [UIImage imageNamed:@"羅丹-思想者.png"]; ? ? ? ??? ? ? ?[self.scrollView addSubview:self.page2]; ? ?
? ? ? ?} ? ? ? ? ?
? ? ? ?if (nextPage == 2 && self.page3 == nil) { ? ? ? ??
? ? ? ?self.page3 = [[UIImageView alloc] initWithFrame:CGRectMake(2 * 320.0f, 0.0f, ? ? ? ? ? ??
? ? ? ?self.view.frame.size.width, self.view.frame.size.height)]; ? ? ? ??
? ? ? ?self.page3.image = [UIImage imageNamed:@"保羅克利-肖像.png"]; ? ? ? ??? ? ? ?[self.scrollView addSubview:self.page3]; ? ??
? ? ? ?} ? ??
? ? ? ?} ?
? ? ? ?@end?
? ? ? ?我們重新修改了這個實例,在viewDidLoad方法中只加載第一張圖片,見第①行代碼。如果用戶滑動屏幕或點 擊分屏控件進入第二個屏幕,則調用loadImage:方法加載第二張圖片,類似地,如果要進入第三個屏幕,則調用 loadImage:方法加載第三張圖片。?
??
? ? ? ?在這兩種實現方式中,LazyLoadPageControlNavigation實現了延遲加載。很顯然,LazyLoadPageControlNavigation 的延遲加載友好很多。那么,兩者究竟有多大的差別,這是可以量化的。通過Instruments工具的Allocations模板,可 以分析ViewController視圖控制器加載時內存占用方面的差別。圖2是無延遲加載實現案例的Allocations模板跟 蹤,圖3是采用延遲加載實現案例的Allocations模板跟蹤。?
圖2 無延遲加載實現案例的Allocations模板跟蹤?
圖3 使用延遲加載實現案例的Allocations模板跟蹤
? ? ? ?如圖2所示,界面啟動用時,內存占用馬上達到8.12MB。如圖3所示,界面啟動用時,內存占用3.08MB, 當我們滑動到第二和第三屏幕時,內存占用達到8.06MB,內存變化會有明顯的兩個階梯。?
? ? ? ?綜上所述,延遲加載的優勢很明顯。如果一定會訪問到資源文件,則延遲加載這些資源文件時,內存占用方面就沒有優勢了,但是在界面加載速度方面還是有優勢的。?? ? ? ?以上便是南昌APP開發公司-百恒網絡為大家介紹的關于資源文件的延遲加載方法,希望對大家有所幫助!此外,如有需要APP開發、網站建設、微信開發等方面的服務的朋友,歡迎來電和我們聯系,百恒隨時為您服務!