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 方法。

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

    相关文章

      网友评论

        本文标题:iOS 懒加载

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