懒加载

作者: 杨大虾 | 来源:发表于2017-04-10 21:48 被阅读136次

    懒加载并没有什么太过特别的地方,但是要注意几点:

    1. 如果用懒加载写的view,比如
    //注意:懒加载时,只有用 self 才能调其 getter 方法
        [self.view addSubview:self.downTableView];
    

    懒加载在一个文件中必须使用一次self.来触发,无论左setting还是右getting(听说写在等号左调用setting,右调用getting),其他时候可以都用_.(成员变量的方式)

    2.懒加载只针对属性变量,局部变量没有这一用法

    1. 如果用懒加载写的数组,在网络回来的时候,记得
    [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里写了网络请求,那么就因为属性没来得及赋参,而导致网络请求失败。


    ps:1.懒加载里面不建议做太多的事情。

    2.使用懒加载会容易遇到对象不销毁的问题,比如说alloc ] init 时引计数加一,addSubView引计数又加一,如果这时候只是置nil(引计数只是减一,还剩1)对象没有销毁,所以,记得removeFromSuperview 和 addSubView对应

    3.个人觉得强调内存管理很有可能,很有可能是用纯代码布局的

    相关文章

      网友评论

        本文标题:懒加载

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