什么是懶加載?ios面試攻克篇(四)


    '寫在前面'
這些是我對iOS面試時會碰到的問題的解決方法,整理出來分享給大家,有些錯誤不要
太好笑,希望對大家有所幫助。大家有更好的解決辦法也歡迎溝通交流。
一直以來都有寫點兒東西的想法,就從筆記、從閱讀開始吧,加油!'


對于剛去面試的ios開發的小白來說,就怕面試官的靈魂提問,代碼是敲不完的,bug也是改不完的,你只能漸漸去完善,所以面對面試官的技術提問,就應更加完善的回答,下面我就對懶加載這個技術點簡單的給各位做下復習吧!!


1.概念問題,什么是“懶加載”?

來些基礎性的書本知識性的概念吧!!(我知道你看過書,但是呢!吾日三省吾身嘛!!接著看吧......)

所謂“懶加載”(Lazy loading) 也被叫作“延遲加載 ”,它的核心思想是把對象的實例化盡量延遲,直到真正用到的時候才將其實例化,這樣做的好處是可以減輕大量對象在實例化時對資源的消耗,而不是在程序初始化的時候就預先將對象實例化。另外,“懶加載”可以將對象的實例化代碼從初始化方法中獨立出來,從而提高代碼的可讀性,以便于代碼能夠更好地被組織。

最典型的一一個應用“懶加載”的例子是在對象的getter 方法中實例化對象的時候。例如getter方法被重寫,使得在第一次調用 getter方法時才實例化對象并將實例化的對象返回。判斷是否是第- -次調用getter 方法可以通過判斷對象是否為空來實現。“懶加載”的getter方法的實現方法就像如下:

/* gettar*/

- (NSObject *)objcct {

if(! object) {

_object = INSObject llcl init];

return objeet;

這種實現方法的缺點是使得gter方法產生副作用,也就是破壞了geter 方法的純潔性。因為按照約定和習慣,gttet 方法就是作為接口簡單地將需要的實例對象返回給外部,這里對內容做了簡單的描述。


2.明白原理,為什么要"懶加載"?

答:什么是懶加載,即延遲加載,在你需要的時候才加載,也就是說在不需要的時候是不會加載的,減小了占用內存。當然在使用懶加載的時候要注意先加一個判斷去判斷有無?
iPhone設備內存有限,如果在程序在啟動后就一次性加載將來會用到的所有資源,那么久可能會耗盡iOS設備的內存。這些資源例如大量的數據,圖片,音頻,過多的控件等。


內存資源全占滿


3.明白"懶加載"思想是什么?

答: 簡單的將就是拖到最后一刻,萬不得已了,才加載,才開始占用資源。所謂懶加載,寫的就是其getter方法。在開發中,當程序中需要利用的資源時,在程序啟動的時候不加載,只有在運行當需要這些資源的時候再去加載這些資源。


4.簡述"懶加載"的好處

答:
1.不必將創建對象的代碼全部寫在viewDidLoad方法中,代碼的可讀性更強。
2.每個屬性的getter方法中分別負責鴿子的實例化處理,代碼彼此間的獨立性更強。
3.只有當真正需要資源的時候,用到的時候才加載,節省了內存資源,占用內存小。


5.實現的步驟:

面試官在有技術實列考核上,你再去演示:

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];
      }


6.需要注意的問題:

1.指針循環引用問題
if (!_titleLabel)不可以寫成 if (!self.titleLabel),不然就會形成循環引用指針。

return _titleLabel;不可以寫成 return self.titleLabel;不然會形成循環引用。
2.如果你用vfl語句或者封裝的Masonry布局頁面的話,

關于frame的那幾句代碼一定不能放重寫的 get 方法里面,不然會報錯
找不到父視圖的錯誤。要放在addSubView那句后面,如:[self.view addSubview:self.textField];


7.有考核 直接對上代碼

實踐才是檢驗真理的唯一標準,話不多說直接開干!!

<pre style="overflow: auto; margin: 0px 0px 0px 22px; font-size: 12px !important; overflow-wrap: break-word; font-family: &quot;Courier New&quot; !important;">#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</pre>
謝謝你長的這么好看,還關注我!!!點個贊唄!!
你的一次推薦就是對我莫大的支持。感覺不錯,給個推薦或者評論吧。
這就是" 懶加載 "相關的點,如果有什么不對的請留言提示,然后有什么別的需要改進的提示請聯系我我會及時補充~

over.over.

部分文章來自轉載他人,如有侵權請聯系作者刪除

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容