有一些數(shù)據(jù)魏保,可能很少會用到澡为,所以沒有必要說某個頁面初始化完畢就加載這些數(shù)據(jù)漂坏,以達到性能的優(yōu)化,這個時候就可以使用到懶加載媒至。
#import "ViewController.h"
@interface ViewController ()
@property (nonatomic, strong) NSArray *cities;
@end
@implementation ViewController
// 懶加載
- (NSArray *)cities {
if (_cities == nil) {
// 因為每次拿 cities 都會調(diào)用 get 方法顶别,為了避免每次都創(chuàng)建,做此判斷
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];
// ... 省略細節(jié)
[button addTarget:self action:@selector(tapToShowCities) forControlEvents:UIControlEventTouchUpInside];
}
- (void)tapToShowCities {
NSLog(@"城市列表-->%@", self.cities);
}
@end
代碼很簡單拒啰,其實就是在點擊按鈕的時候才去加載數(shù)據(jù)驯绎,在
NSLog(@"城市列表-->%@", self.cities);
中,self.cities
其實就是調(diào)用了 cities 的 get 方法谋旦,所以 self.cities
等同于 [self cities]
剩失,這個時候就調(diào)用 cities 已經(jīng)重寫的 get 方法,而不是一開始在 viewDidLoad
里面加載那個 plist 數(shù)據(jù)册着。由于每一次執(zhí)行 self.cities
的時候都會調(diào)用 cities 的 get 方法拴孤,所以在 get 方法里面做一個判斷:如果 cities 還沒有數(shù)據(jù)在里面才去加載。
值得注意的是甲捏,在
// 懶加載
- (NSArray *)cities {
if (_cities == nil) {
// 因為每次拿 cities 都會調(diào)用 get 方法演熟,為了避免每次都創(chuàng)建,做此判斷
NSBundle *bundle = [NSBundle mainBundle];
NSString *filePath = [bundle pathForResource:@"Cities" ofType:@"plist"];
_cities = [NSArray arrayWithContentsOfFile:filePath];
}
return _cities;
}
這個 get 方法里面司顿,_cities
能不能使用點語法 self.cities
呢绽媒?
對于初學(xué)者來說蚕冬,可能有點懵逼。在這段代碼中是辕,有 3 個 _cities
囤热,其中第一個 _cities
如果替換成 self.cities
肯定不行,因為 self.cities
也就是 cities 的 get 方法获三,因此旁蔼,如果在這里使用了 self.cities
,就會導(dǎo)致一直調(diào)用這個 get 方法疙教,最后一個 _cities
同理棺聊,都不可以使用 self.cities
。
而中間那個 _cities
如果使用 self.cities
來代替贞谓,則是可以的限佩,因為在這里 self.cities
等同于 cities 的 set 方法。
這個問題我也是一開始懵逼的裸弦,后來才懂的祟同,記錄一下??