iOS 懶加載的使用

寫在前面

昨天晚上寫的那個代碼在配置數組數據的時候突然想到加載數據的時候可以不用在viewDidLoad中加載,可以什么時候用什么時候加載,這種技術就是這篇文章的懶加載方法。然后記錄一下。內容如下:

什么是懶加載

懶加載又稱為延遲加載,它是指系統不會在初始化是就加載某個對象,而是在第一次調用(使用 get 方法)時才加載這個對象到內存,簡單點兒說就是當對象被系統或者開發者需要用到的時候再去加載。它的實現方法實質上就是覆寫該對象的 get 方法,并將該對象在初始化時需要實現的代碼在 get 方法中實現。

使用懶加載的優點

  • 不需要在 viewDidLoad 中實例化對象,簡化代碼,使結構清晰易懂,增強代碼的可讀性
  • 對象的實例化在getter方法中,對象各司其職,降低代碼耦合性
  • 提升初始化加載速度,對系統的內存占用率會減小
  • 減少內存占用

viewDidLoad正常加載代碼示例

就拿昨天的那個功能的實現中用到的數組來說吧,在viewDidLoad中正常加載是這樣子的:

@interface ViewController ()<UITableViewDelegate, UITableViewDataSource>
@property (nonatomic, strong) NSArray *infoArr;//數組
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    [self configData];
}

- (void)configData {
    _infoArr = @[@{@"title":@"出團日期", @"routeName":@"線路名稱一", @"time":@"2015/11/21", @"num":@"20", @"price":@"124.0", @"code":@"DAGSDSASA"},
                 @{@"title":@"余位", @"routeName":@"線路名稱二", @"time":@"2015/11/21", @"num":@"34", @"price":@"234", @"code":@"TAGDFASFAF"},
                 @{@"title":@"價格", @"routeName":@"線路名稱三", @"time":@"2015/11/21", @"num":@"12", @"price":@"634", @"code":@"GHGASDAS"},
                 @{@"title":@"團代號", @"routeName":@"線路名稱四", @"time":@"2015/11/56", @"num":@"54", @"price":@"632", @"code":@"DAADSFAD"}];
}
  • 從上面的代碼片段中很容易看出來,當控制器被加載完之后也就開始加載viewDidLoad中的內容了,(這個關于viewControllerview的生命周期也可以看我之前寫的一篇文章,鏈接在這兒:http://www.lxweimin.com/p/85c98a9e93eb 《UIViewController中View的生命周期》),假設這個_infoArr是在某些事件被觸發之后才會被調用,這時就沒有必要再控制器加載完就去加載這個數組數據了,如果事件不觸發就意味著_infoArr永遠不會被加載,這樣的話在viewDidLoad中把它加載了就顯得很多余了并且也是很耗內存的。

懶加載方法示例

- (NSArray *)infoArr {
    if (!_infoArr) {
        _infoArr = @[@{@"title":@"出團日期", @"routeName":@"線路名稱一", @"time":@"2015/11/21", @"num":@"20", @"price":@"124.0", @"code":@"DAGSDSASA"},
                     @{@"title":@"余位", @"routeName":@"線路名稱二", @"time":@"2015/11/21", @"num":@"34", @"price":@"234", @"code":@"TAGDFASFAF"},
                     @{@"title":@"價格", @"routeName":@"線路名稱三", @"time":@"2015/11/21", @"num":@"12", @"price":@"634", @"code":@"GHGASDAS"},
                     @{@"title":@"團代號", @"routeName":@"線路名稱四", @"time":@"2015/11/56", @"num":@"54", @"price":@"632", @"code":@"DAADSFAD"}];
    }
    return _infoArr;
}
  • 像上面這種調用getter方法的加載方式就是懶加載了,這樣當需要用到_infoArr的時候,就會調用[self infoArr]方法(既是getter方法),此時系統會去調用getter方法,然后在getter方法中獲取數據的賦值,然后返回供使用(需要值得注意的地方就是在getter方法中不要使用self.infoArr, 因為self.infoArr會調用getter方法,造成死循環)。

*關于對象的setter和getter方法我會抽時間做個總結 *

總結

晚安

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

推薦閱讀更多精彩內容

  • 寫在前面 代碼在配置數組數據的時候可以不用在viewDidLoad中加載,可以什么時候用什么時候加載,這種技術就是...
    無灃閱讀 229評論 0 0
  • 轉至元數據結尾創建: 董瀟偉,最新修改于: 十二月 23, 2016 轉至元數據起始第一章:isa和Class一....
    40c0490e5268閱讀 1,768評論 0 9
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結起來就是把...
    Dove_iOS閱讀 27,210評論 30 471
  • 又是一年雙十一,jd和al緊鑼密鼓,戰績如何今晚揭曉這幾天有點感冒,水痘疫苗推遲到下周了喜歡看嘰里呱啦每天晚上,你...
    星空下的悠游閱讀 159評論 0 1
  • 場景 大家都是coder,所以說日志對我們來說相當的重要。大家都知道級別:debug<info<warn<erro...
    coder_liu閱讀 712評論 0 0