iOS 懒加载

作者: angelen | 来源:发表于2016-06-28 23:55 被阅读551次

有一些数据,可能很少会用到,所以没有必要说某个页面初始化完毕就加载这些数据,以达到性能的优化,这个时候就可以使用到懒加载。

#import "ViewController.h"

@interface ViewController ()

@property (nonatomic, strong) NSArray *cities;

@end

@implementation ViewController

// 懒加载
- (NSArray *)cities {
    if (_cities == nil) {
        // 因为每次拿 cities 都会调用 get 方法,为了避免每次都创建,做此判断
        NSBundle *bundle = [NSBundle mainBundle];
        NSString *filePath = [bundle pathForResource:@"Cities" ofType:@"plist"];
        _cities = [NSArray arrayWithContentsOfFile:filePath];
    }
    return _cities;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    UIButton *button = [[UIButton alloc] init];
    // ... 省略细节
    [button addTarget:self action:@selector(tapToShowCities) forControlEvents:UIControlEventTouchUpInside];
}

- (void)tapToShowCities {
    NSLog(@"城市列表-->%@", self.cities);
}

@end

代码很简单,其实就是在点击按钮的时候才去加载数据,在

NSLog(@"城市列表-->%@", self.cities);

中,self.cities 其实就是调用了 cities 的 get 方法,所以 self.cities 等同于 [self cities],这个时候就调用 cities 已经重写的 get 方法,而不是一开始在 viewDidLoad 里面加载那个 plist 数据。由于每一次执行 self.cities 的时候都会调用 cities 的 get 方法,所以在 get 方法里面做一个判断:如果 cities 还没有数据在里面才去加载。
值得注意的是,在

// 懒加载
- (NSArray *)cities {
    if (_cities == nil) {
        // 因为每次拿 cities 都会调用 get 方法,为了避免每次都创建,做此判断
        NSBundle *bundle = [NSBundle mainBundle];
        NSString *filePath = [bundle pathForResource:@"Cities" ofType:@"plist"];
        _cities = [NSArray arrayWithContentsOfFile:filePath];
    }
    return _cities;
}

这个 get 方法里面,_cities 能不能使用点语法 self.cities 呢?

对于初学者来说,可能有点懵逼。在这段代码中,有 3 个 _cities,其中第一个 _cities 如果替换成 self.cities 肯定不行,因为 self.cities 也就是 cities 的 get 方法,因此,如果在这里使用了 self.cities,就会导致一直调用这个 get 方法,最后一个 _cities 同理,都不可以使用 self.cities

而中间那个 _cities 如果使用 self.cities 来代替,则是可以的,因为在这里 self.cities 等同于 cities 的 set 方法。

这个问题我也是一开始懵逼的,后来才懂的,记录一下🌚

相关文章

  • Swift的懒加载和只读属性的介绍

    懒加载 在 iOS 开发中,懒加载是无处不在的 懒加载的格式如下: lazy var person: Person...

  • iOS-UI-懒加载

    原文找不到了 iOS-UI-懒加载 1.懒加载基本 懒加载——也称为延迟加载,即在需要的时候才加载(效率低,占用内...

  • 2018-12-21

    iOS开发中懒加载遇到的坑 正常写一个懒加载对象 - (MAMapView*)mapView{ if(nil=...

  • iOS 数组 NSArray 遍历 懒加载总结

    iOS开发之懒加载 iOS中数组遍历的方法及比较

  • iOS开发——懒加载

    懒加载的定义 懒加载也称为延迟加载,即在需要的时候才加载(效率低,占用内存小)。iOS设备的内存有限,如果程序在启...

  • # 懒加载

    在 iOS 开发中,懒加载是无处不在的 懒加载的格式如下: 懒加载本质上是一个闭包 以上代码可以改写为以下格式 懒...

  • iOS开发之懒加载

    iOS开发之懒加载 在iOS开发中几乎经常用到懒加载技术,比如我们存放网络数据的数组,控制器的view,控件的自定...

  • iOS 懒加载

    懒加载:也称延时加载,即在对象用到的的时候才加载。其实懒加载,就是所谓的重写对象的get方法,当系统或者开发者调用...

  • iOS懒加载

    所谓的懒加载可以定义为:延时加载,即当对象需要用到的时候再去加载。其实就是所谓的重写对象的get方法,当系统或者开...

  • iOS懒加载

    iOS懒加载 简单的讲就是拖到最后一刻,万不得已了,才加载,才开始占用资源。所谓懒加载,写的就是其getter方法...

网友评论

    本文标题:iOS 懒加载

    本文链接:https://www.haomeiwen.com/subject/lgttjttx.html