iOS中的懶加載

iOS開發(fā)中 我們經(jīng)常使用懶加載
1.懶加載的好處,讓控件和對象在最需要加載的時(shí)候加載羊精。這樣可以節(jié)省內(nèi)存空間,因?yàn)槲覀円苿?dòng)的設(shè)備資源還是比較寶貴的。所謂懶加載 就是推遲他的getter方法的執(zhí)行。
比如衡未。一個(gè)view的子控件 氓轰,只有當(dāng)這個(gè)view被顯示的時(shí)候才去加載婚夫。一個(gè)tableViewCell中,給他設(shè)置了圖片署鸡,他的content View里面才包含imageView的圖片案糙,只有設(shè)置了textLabel的內(nèi)容,才會(huì)加載這個(gè)textLabel.

//collectionView的數(shù)據(jù)源--屬性申明
@property (nonatomic, strong) NSArray *famouseDoctorArr;

//懶加載
-(NSArray *)famouseDoctorArr{
if (_famouseDoctorArr == nil) {
_famouseDoctorArr =[FDFamousDoctorsTong famousDoctorsTongArr];
}
return _famouseDoctorArr;
}
// collectionView的懶加載屬性申明

@property (nonatomic, strong) UICollectionView *collectionView;

-(UICollectionView *)collectionView{
if (_collectionView == nil) {

    _collectionView = [[UICollectionView alloc]initWithFrame:CGRectZerocollectionViewLayout:self.layout];
    _collectionView.backgroundColor =[UIColor orangeColor];
    // 指定代理
    _collectionView.dataSource = self;
    _collectionView.delegate = self;
    //注冊cell
    //    [self.collectionView registerClass:[FDIllCollectionViewCell class] forCellWithReuseIdentifier:@"illCell"];
    [_collectionView registerNib:[UINib nibWithNibName:@"FDIllCollectionViewCell"bundle:nil] forCellWithReuseIdentifier:@"illCell"];
    
}
return _collectionView;

}

-----說說我今天在懶加載中遇到的問題//1.0---我的illView中 collection View中的 cell被點(diǎn)擊了靴庆。

-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{
//把模型傳遞給下一個(gè)控制器
FDFamousDoctorsTong *famouseDoctorTong = self.famouseDoctorArr[indexPath.item];

if (indexPath.item == self.famouseDoctorArr.count - 1) {
    NSLog(@"加載公益活動(dòng)界面");
}else{
    //跳轉(zhuǎn)到疾病選擇控制器 --通知主頁控制器切換
    if ([self.delegate respondsToSelector:@selector(illViewDidSelectItem:)]) {
        [self.delegate illViewDidSelectItem:famouseDoctorTong];
    }    
}

}

// 在獲取這個(gè)illView中控制器中實(shí)現(xiàn)代理方法

pragma mark - 疾病視圖cell被點(diǎn)擊的回調(diào)代理方法 ---執(zhí)行跳轉(zhuǎn)方法 傳遞模型

-(void)illViewDidSelectItem:(FDFamousDoctorsTong *)famouseDodctorTong{

// 從storyBoard里面加載Controller
UIStoryboard *sb =[UIStoryboard storyboardWithName:@"FDIllDetailViewController"bundle:nil];

//FDIllDetailViewController *detailVc =[sb instantiateViewControllerWithIdentifier:@"detailVC"];

FDIllDetailViewController *detailVc = sb.instantiateInitialViewController;
detailVc.title = @"疾病選擇詳情";
detailVc.famousDoctorsTong = famouseDodctorTong;
detailVc.view.backgroundColor =[UIColor colorWithRed:241/255.0 green:241/255.0blue:241/255.0 alpha:1.0];
[self.navigationController pushViewController:detailVc animated:YES];

}

//3.0重寫模型的setter方法給控件的屬性賦值

pragma mark - 從主頁控制器點(diǎn)擊疾病跳轉(zhuǎn)的得到參數(shù)重寫模型的setter方法

-(void)setFamousDoctorsTong:(FDFamousDoctorsTong *)famousDoctorsTong{
_famousDoctorsTong = famousDoctorsTong;
NSLog(@"famousDoctorsTong.title:%@",famousDoctorsTong.title);

self.illTypeLabel.text = [NSString stringWithFormat:@"疾病類型:%@",famousDoctorsTong.title];

}

好了看似沒有什么問題时捌,但是打斷點(diǎn) 發(fā)現(xiàn) self.illTypeLabel 這個(gè)控件是nil
為什么 調(diào)用setter方法的時(shí)候還沒有加載這個(gè)控制器的view,所以子控件也是沒有加載的
----解決辦法 把賦值的代碼方法放到viewDidLoad里面去

  • (void)viewDidLoad {
    [super viewDidLoad];

    //TODO測試

    self.treatedMethodView.hidden = YES;

    [self.illDetailBtn setBackgroundColor:[UIColor clearColor]];
    [self.complicateBtn setBackgroundColor:[UIColor clearColor]];
    [self.selectTreatMethodBtn setBackgroundColor:[UIColor clearColor]];

      self.illTypeLabel.text =[NSString stringWithFormat:@"疾病類型:%@",self.famousDoctorsTong.title];
    

    }

// 最后來一個(gè)總結(jié)

懶加載的優(yōu)點(diǎn)不需將對象的實(shí)例化寫到viewDidLoad炉抒,可以簡化代碼奢讨,增強(qiáng)代碼的可讀性
對象的實(shí)例化在getter方法中,各司其職焰薄,降低耦合性
對系統(tǒng)的內(nèi)存占用率會(huì)減小

viewDidLoad正常加載代碼示例
沒用懶加載的時(shí)候拿诸,從plist獲取數(shù)據(jù),返回一個(gè)數(shù)組塞茅,需要寫在viewDidLoad方法中獲取

@interface ViewController ()@property (nonatomic, strong) NSArray *shopData;@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; _shopData = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"shop" ofType:@"plist"]];}@end

顯而易見佳镜,當(dāng)控制器被加載完成后就會(huì)加載當(dāng)前的shopData,假如shopData是在某些事件被觸發(fā)的時(shí)候才會(huì)被調(diào)用凡桥,沒必要在控制器加載完就去獲取plist文件蟀伸,如果事件不被觸發(fā),代表著shopData永遠(yuǎn)不會(huì)被用到缅刽,這樣在viewDidLoad中加載shopData就會(huì)十分多余啊掏,并且耗用內(nèi)存

懶加載代碼示例

  • (void)viewDidLoad { [super viewDidLoad];}- (NSArray *)shopData{ if (!_shopData) { _shopData = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"shop" ofType:@"plist"]]; } return _shopData;}@end

當(dāng)需要用到shopData的時(shí)候,就會(huì)調(diào)用[self shopData]的方法(即getter方法)衰猛,此時(shí)系統(tǒng)會(huì)去調(diào)用getter方法迟蜜,然后再getter方法中獲取plist文件內(nèi)容,然后返回使用(需要注意在getter方法里切勿使用self.shopData啡省,因?yàn)閟elf.shopData會(huì)調(diào)用getter方法娜睛,造成死循環(huán))總結(jié):懶加載即用到時(shí)方去加載對象

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市卦睹,隨后出現(xiàn)的幾起案子畦戒,更是在濱河造成了極大的恐慌,老刑警劉巖结序,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件障斋,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)垃环,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進(jìn)店門邀层,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人遂庄,你說我怎么就攤上這事寥院。” “怎么了涛目?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵只磷,是天一觀的道長。 經(jīng)常有香客問我泌绣,道長钮追,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任阿迈,我火速辦了婚禮元媚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘苗沧。我一直安慰自己刊棕,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布待逞。 她就那樣靜靜地躺著甥角,像睡著了一般。 火紅的嫁衣襯著肌膚如雪识樱。 梳的紋絲不亂的頭發(fā)上嗤无,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天,我揣著相機(jī)與錄音怜庸,去河邊找鬼当犯。 笑死,一個(gè)胖子當(dāng)著我的面吹牛割疾,可吹牛的內(nèi)容都是我干的嚎卫。 我是一名探鬼主播,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼宏榕,長吁一口氣:“原來是場噩夢啊……” “哼拓诸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起麻昼,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤奠支,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后涌献,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體胚宦,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡首有,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年燕垃,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了枢劝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,626評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡卜壕,死狀恐怖您旁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情轴捎,我是刑警寧澤鹤盒,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站侦副,受9級特大地震影響侦锯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜秦驯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一尺碰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧译隘,春花似錦亲桥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至厅目,卻和暖如春番枚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背损敷。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工户辫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人嗤锉。 一個(gè)月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓渔欢,卻偏偏與公主長得像,于是被迫代替她去往敵國和親瘟忱。 傳聞我的和親對象是個(gè)殘疾皇子奥额,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評論 2 348

推薦閱讀更多精彩內(nèi)容