iOS-設計模式-懶載入,ios-設計模式載入
一.為什麼要懶載入?答: iPhone裝置記憶體有限,如果在程式在啟動後就一次性載入將來會用到的所有資源,那麼久可能會耗盡iOS裝置的記憶體。這些資源例如大量的資料,圖片,音頻,過多的控制項等。二.懶載入思想是什嗎?答: 簡單的將就是拖到最後一刻,萬不得已了,才載入,才開始佔用資源。所謂懶載入,寫的就是其getter方法。在開發中,當程式中需要利用的資源時,在程式啟動的時候不載入,只有在運行當需要這些資源的時候再去載入這些資源。三: 懶載入的好處答: 1.不必將建立對象的代碼全部寫在viewDidLoad方法中,代碼的可讀性更強。 2.每個屬性的getter方法中分別負責鴿子的執行個體化處理,代碼彼此間的獨立性更強。 3.只有當真正需要資源的時候,再去載入,節省了記憶體資源。四:步驟: 1.在 @interface 裡聲明需要屬性。比如我需要兩個控制項label和textfield @interface ViewController () @property (nonatomic,strong) UILabel * titleLabel; @property (nonatomic,strong) UITextField *textField; @end 2.重寫聲明屬性的getter方法(切記不要自己手動寫,Xcode會自動提示出來,寫出就費了) #pragma mark 重寫titleLabel的getter方法
- (UILabel *)titleLabel
{ if (!_titleLabel) { self.titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 20, 100, 40)]; self.titleLabel.textAlignment = NSTextAlignmentCenter; self.titleLabel.textColor = [UIColor blackColor]; self.titleLabel.text = @"呵呵"; [self.titleLabel sizeToFit]; } return _titleLabel; } 3.調用重寫的方法 self.方法名 //在viewDidLoad裡面調用initUI方法。 - (void)initUI { //只是載入到預想載入的view上。不在初始化方法裡為其alloc/init。只是一個指標,不會佔記憶體。 [self.view addSubview:self.titleLabel]; [self.view addSubview:self.textField]; }五.注意的問題: 1.指標循環參考問題 if (!_titleLabel)不可以寫成if (!self.titleLabel),不然就會形成循環參考指標。 return _titleLabel;不可以寫成return self.titleLabel;不然會形成循環參考。 2.如果你用vfl語句或者封裝的Masonry布局頁面的話,關於frame的那幾句代碼一定不能放重寫的get方法裡面,不然會報 找不到父視圖的錯誤。要放在addSubView那句後面,如:[self.view addSubview:self.textField];六.上代碼
#import "ViewController.h"@interface ViewController ()@property (nonatomic,strong) UILabel * titleLabel;@property (nonatomic,strong) UITextField *textField;@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; [self initUI];}- (void)initUI{ //只是載入到預想載入的view上。不在初始化方法裡為其alloc/init。只是一個指標,不會佔記憶體。 [self.view addSubview:self.titleLabel]; [self.view addSubview:self.textField];}#pragma mark 重寫titleLabel的getter方法- (UILabel *)titleLabel{ if (!_titleLabel) { self.titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 20, 100, 40)]; self.titleLabel.textAlignment = NSTextAlignmentCenter; self.titleLabel.text = @"呵呵"; self.titleLabel.textColor = [UIColor blackColor]; [self.titleLabel sizeToFit]; } return _titleLabel;}#pragma mark 重寫的textField的getter方法- (UITextField *)textField{ if (!_textField) { self.textField = [[UITextField alloc] initWithFrame:CGRectMake(10, 100, 100, 40)]; self.textField.borderStyle = UITextBorderStyleRoundedRect; self.textField.clearButtonMode = UITextFieldViewModeWhileEditing; self.textField.placeholder = @"hehe"; } return _textField;}@end