iOS回顾之路-懒加载
cxh0624
8年前
<p>最近会根据自己收藏的优秀博文和自己从业以来遇到的问题进行总结。知识有限,请各位大神指点不足。</p> <h3><strong>细说懒加载</strong></h3> <p>之所以使用到懒加载是因为设备内存有限,如果在程序启动后就一次性加载将来会用到的所有资源,就可能会耗尽设备的内存。比如大量的数据、图片、音频、过多的控件等。</p> <p>针对这一问题,就引入了懒加载的概念:在程序启动的时候不加载,只在运行时需要这些资源的时候再去加载这些资源。(提醒:这是苹果公司提倡的做法。其实苹果公司做的iOS系统中很多地方都用到了懒加载的方式,比如控制器的View的创建。)</p> <p>这么做的好处也是显而易见的:我们不必将创建对象的代码全部写在viewDidLoad方法中,这样可以使代码的可读性更强。每个控件的getter方法中分别负责各自的实例化处理,代码彼此之间的独立性强,低耦合。更重要的是当真正需要资源的时候才去加载资源,节省了内存资源。</p> <h3><strong>懒加载的思路</strong></h3> <p>1.在类扩展中创建一个属性</p> <p>2.重写这个属性对应的getter,将要实现的逻辑放到这个getter中</p> <p>3.考虑到懒加载只加载一次,那么在实现逻辑之前应该判断一下这个属性是否为空,为空才执行逻辑,否则直接返回这个属性</p> <pre> //创建一个可变字典属性 @interface ViewController () @property (nonatomic ,strong)NSMutableDictionary *dic; @end</pre> <pre> @implementation ViewController //重写这个属性 -(NSMutableDictionary *)dic{ //判断字典是否已经存在,若没有,则进行实例化 if (_dic == nil) { _dic = [NSMutableDictionary dictionary]; } return _dic; } @end</pre> <p>注意1.指针循环引用问题</p> <pre> if (!_dic)不可以写成 if (!self.dic),不然就会形成循环引用指针。 return _dic;不可以写成 return self.dic,不然会形成循环引用。</pre> <p>注意2.关于布局的问题</p> <pre> 如果你用vfl语句或者封装的Masonry布局页面的话,关于frame的代码一定不能放重写的 get方法里面,不然会报“找不到父视图”的错误。要放在addSubVie后面</pre> <p style="text-align: center;"><img src="https://simg.open-open.com/show/d4d6b5eded81f2df12e8fa955b9b4545.jpg"></p> <p style="text-align: center;">1.png</p> <p> </p> <p> </p> <p>来自:http://www.jianshu.com/p/b54a07b78432</p> <p> </p>