懶加載 學(xué)習(xí)記錄

什么是懶加載

懶加載是延時加載,即在使用到該對象的時候才將其加載到內(nèi)存中沟涨。

為什么要用懶加載

主要目的是為了提升效率

  1. 在iOS開發(fā)中恤批,加載數(shù)據(jù)的操作一般放在viewDidLoad中,而如果此時展示的界面不需要數(shù)據(jù)裹赴,那我們可能會因為人為的加載了數(shù)據(jù)而影響了系統(tǒng)的性能喜庞。還不如讓系統(tǒng)利用這段時間做它認(rèn)為更加重要的事情。
  2. 在iOS開發(fā)中棋返,如果某個APP占用內(nèi)存過大延都,系統(tǒng)會給這個APP發(fā)送內(nèi)存警告,一般當(dāng)APP接收到內(nèi)存警告時睛竣,即在didReceiveMemoryWarning方法中程序員會做一些清理內(nèi)存的操作晰房,此時我們的數(shù)據(jù)或者其他控件占用的內(nèi)存可能會被清理掉,這時如果再去訪問這塊內(nèi)存就會出現(xiàn)野指針的問題射沟。

綜合以上兩點殊者,我們采用懶加載的方式對數(shù)據(jù)以及控件進行加載,這樣可以保證在使用的時候去加載验夯,而且能保證使用時肯定有猖吴。

怎么用懶加載

懶加載的實現(xiàn),就是重寫對象的getter方法挥转。即在系統(tǒng)調(diào)用某個對象之前先進行判斷,如果有這個對象(即對象不為空)就直接返回這個對象绑谣,如果對象為空就創(chuàng)建它并且返回它。一般而言需要懶加載的是數(shù)據(jù)類型和UI控件借宵,以下將對這兩點分開闡述。

數(shù)據(jù)類型的懶加載

數(shù)據(jù)類型的懶加載一般包括字典暇务,數(shù)組,以及自定義的模型數(shù)據(jù)垦细。以數(shù)組為例,懶加載的實現(xiàn)為:

@interface NewObject()

//聲明一個數(shù)組屬性(數(shù)據(jù)類型聲明為strong)
@property (nonatomic, strong) NSArray * myArray;
@end

@implementation NewObject

//重寫myArray的getter方法
- (NSArray *)myArray{
    
    if (_myArray == nil) {
        _myArray = [[NSArray alloc] init];
    }
    return _myArray;
}

UI控件的懶加載

UI控件一般包括UIView, UIButton等控件括改。以UIButton為例,如果使用storyboard,在連線時系統(tǒng)默認(rèn)在類擴展中自動生成@property (weak, nonatomic) IBOutlet UIButton *myButton;吝梅。之所以聲明為weak屬性,是因為storyboard已經(jīng)對myButton做了強引用苏携,所以在類擴展中直接聲明為weak屬性,這樣減少了出現(xiàn)內(nèi)存泄露的可能右冻。
而使用純代碼實現(xiàn)時,一般的代碼模式是

@property (weak, nonatomic) UIButton *myButton;
@end

@implementation ViewController

- (UIButton *)myButton{
    
    if (_myButton == nil) {
        UIButton * tempButton = [[UIButton alloc] init];
        _myButton = tempButton;
        [self.view addSubview: _myButton];
    }
    return _myButton;
}

以上代碼需要注意幾個地方:

  1. 為了和storyboard的形式一致纱扭,同時也是為了讓控件在不用的時候能及時被銷毀,屬性也聲明成了weak類型乳蛾。

  2. weak類型的變量就不能使用_myButton = [[UIButton alloc] init];進行定義。因為myButton是用weak修飾的肃叶,這樣用[[UIButton alloc] init]申請的內(nèi)存就只被weak類型的指針指向,而根據(jù)ARC內(nèi)存管理機制被环,如果一個對象不再被strong指針指向详幽,它將會被釋放筛欢。所以此處要利用以上的格式定義這個對象唇聘。即
    UIButton * tempButton = [[UIButton alloc] init]; _myButton = tempButton;
    這樣在本層大括號的作用域內(nèi)申請的內(nèi)存地址就有強指針指向了。

  3. 對于子控件必須要加載到父view上才能顯示出來迟郎。所以必須執(zhí)行addSubview,而這條語句在懶加載中實現(xiàn)即可。具體原因如以下記錄中的注釋

if (_myButton == nil) {
        UIButton * tempButton = [[UIButton alloc] init];
        _myButton = tempButton;
        [self.view addSubview: _myButton];//調(diào)用addSubview宪肖,self.view 會對myButton有強引用
    }//出了這個大括號,tempButton 這個局部對象將會被銷毀控乾,如果前面沒有執(zhí)行addSubview,那新申請的button內(nèi)存又會被釋放
    return _myButton;//如果不執(zhí)行addSubview或者其他對button內(nèi)存強引用的語句蜕衡,那么此處返回的將是nil。

當(dāng)然,以上的示例代碼不是絕對的久脯,實現(xiàn)一個功能的方法多種多樣,只不過是自己習(xí)慣了這種寫法帘撰,就簡單記錄一下。

磨礪|分享|提高

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末相赁,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子钮科,更是在濱河造成了極大的恐慌,老刑警劉巖婆赠,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蛆挫,居然都是意外死亡,警方通過查閱死者的電腦和手機悴侵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來可免,“玉大人,你說我怎么就攤上這事浇借。” “怎么了妇垢?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長闯估。 經(jīng)常有香客問我,道長涨薪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任尤辱,我火速辦了婚禮砂豌,結(jié)果婚禮上光督,老公的妹妹穿的比我還像新娘。我一直安慰自己结借,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布船老。 她就那樣靜靜地躺著,像睡著了一般柳畔。 火紅的嫁衣襯著肌膚如雪馍管。 梳的紋絲不亂的頭發(fā)上薪韩,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天,我揣著相機與錄音罗捎,去河邊找鬼。 笑死拉盾,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的捉偏。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼屎暇,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了驻粟?” 一聲冷哼從身側(cè)響起凶异,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎酷麦,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體喉恋,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡母廷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年琴昆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片馆揉。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖升酣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情噩茄,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布绩聘,位于F島的核電站,受9級特大地震影響君纫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蓄髓,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望会喝。 院中可真熱鬧陡叠,春花似錦、人聲如沸肢执。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至耻陕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間诗宣,已是汗流浹背膘怕。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工岛心, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留来破,地道東北人忘古。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像存皂,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子旦袋,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,955評論 2 355

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