懒加载并没有什么太过特别的地方,但是要注意几点:
- 如果用懒加载写的view,比如
//注意:懒加载时,只有用 self 才能调其 getter 方法
[self.view addSubview:self.downTableView];
懒加载在一个文件中必须使用一次self.来触发,无论左setting还是右getting(听说写在等号左调用setting,右调用getting),其他时候可以都用_.(成员变量的方式)
2.懒加载只针对属性变量,局部变量没有这一用法
- 如果用懒加载写的数组,在网络回来的时候,记得
[self.listArr removeObjectAtIndex:_row];
[self.selectedArr removeAllObjects];
remove掉哦喔。
3.懒加载的对象不用self 防止循环引用,比如:
//懒加载 webView 增加流畅度
- (UIWebView *)webView{
//注意,这里不用 self 防止循环引用
if (!_webView) {
_webView = [[UIWebView alloc]initWithFrame:CGRectMake(0, _tableView.contentSize.height, self.view.frame.size.width, self.view.frame.size.height)];
_webView.delegate = self;
_webView.delegate = self;
_webView.scrollView.delegate = self;
[_webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"https://www.baidu.com"]]];
}
return _webView;
}
改
- (UIWebView *)webView{
__weak typeof(self) weakSelf = self;
//注意,这里不用 self 防止循环引用
if (!_webView) {
_webView = [[UIWebView alloc]initWithFrame:CGRectMake(0, _tableView.contentSize.height, weakSelf.view.frame.size.width, weakSelf.view.frame.size.height)];
_webView.delegate = weakSelf;
_webView.delegate = weakSelf;
_webView.scrollView.delegate = weakSelf;
[_webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"https://www.baidu.com"]]];
}
return _webView;
}
4.纯代码布局建议用懒加载
延伸:
==
1.懒加载基本
懒加载——也称为延迟加载,即在需要的时候才加载(效率高,占用内存小)。所谓懒加载,写的是其getter方法。说的通俗一点,就是在开发中,当程序中需要利用的资源时。在程序启动的时候不加载资源,只有在运行当需要一些资源时,再去加载这些资源。
我们知道iOS设备的内存有限,如果在程序在启动后就一次性加载将来会用到的所有资源,那么就有可能会耗尽iOS设备的内存。这些资源例如大量数据,图片,音频等等,所以我们在使用懒加载的时候一定要注意先判断是否已经有了,如果没有那么再去进行实例化
2.使用懒加载的好处:
(1)不必将创建对象的代码全部写在viewDidLoad方法中,代码的可读性更强
(2)每个控件的getter方法中分别负责各自的实例化处理,代码彼此之间的独立性强,松耦合
(3)只有当真正需要资源时,再去加载,节省了内存资源。
(4) 然后我们通过重写属性的getter方法可以完成lazy loading(懒加载)模式,使用lazy loading可以将代码按照模块封装,同时提高类的灵活度,也可以在一定时期内节省内存的使用。比如:对于当前的父级View,使用lazy loading表示我提供了两个子视图/子控件的属性,如果需要使用,秩序调用getter方法既可以显示该子视图,如果不需要,父级视图就是一个空的视图
特别提醒:这是苹果公司提倡的做法。比如控制器的View的创建。视图控制器的View属性属于懒加载(重写gett方法),第一次调用view的getting方法就是当视图控制器成为Window的根视图控制器之后,window需要将视图控制器的视图显示出来是,这个时候view属性的getti就会判断如果_view不存在,则调用视图控制器的loadView方法加载视图,在执行viewDidLoad方法加载器索要管理的视图
正因为此,发现了colleague的一个bug:
colleague喜欢跳转到下一个UIViewController时,用属性来传参的(而且他的哪些参数是要发送网络请求的),如果在属性之前就调用了self.view 比如,self.view.backgroundColor = [UIColor widthColor];因为是懒加载,所以没有run下面的属性参数就立即调用viewDidLoad,刚好viewDidLoad里写了网络请求,那么就因为属性没来得及赋参,而导致网络请求失败。