(0020)iOS 开发之-设计模式-懒加载解惑
提醒:这是苹果公司提倡的做法。其实苹果公司做的IOS系统中很多地方都用到了懒加载的方式,比如控制器的View的创建。
懒加载:也称为延迟加载,即在需要的时候才加载(效率低,占用内存小)。所谓懒加载,其实就是重写getter方法。说的通俗一点,就是在开发中,当程序中需要利用的资源时。在程序启动的时候不加载资源,只有在运行当需要一些资源时,再去加载这些资源。
我们知道iOS设备的内存有限,如果在程序在启动后就一次性加载将来会用到的所有资源,那么就有可能会耗尽iOS设备的内存。这些资源例如大量数据,图片,音频等等,所以我们在使用懒加载的时候一定要注意先判断是否已经有了,如果没有那么再去进行实例化。
1 .使用懒加载的好处:
(1)不必将创建对象的代码全部写在viewDidLoad方法中,代码的可读性更强
(2)每个控件的getter方法中分别负责各自的实例化处理,代码彼此之间的独立性强,松耦合
(3)只有当真正需要资源时,再去加载,节省了内存资源。
- (NSMutableArray *)users
{
if (!_users) { // 1部分
_users = [NSMutableArray array]; // 2部分
}
return _users; // 3部分
}
// 1部分:不能写成 !self.users 这也是一个getter,getter中有getter会造成死循环
// 2部分:可以使用self.users,这是一个setter
// 3部分:不能使用self.users,这也是一个getter,getter中有getter会造成死循环
// 如果用vfl语句或者封装的Masonry布局页面的话,关于frame的那几句代码一定不能放重写的get方法里面,不然会报找不到父视图的错误。要写在addSubView的后面。
// 懒加载
- (UIButton *)cover
{
if (_cover == nil ) { //这里为什么不能能用self.cover
_cover = [[UIButton alloc] initWithFrame:self.view.bounds];
self.cover.backgroundColor = [UIColor colorWithWhite:0.0 alpha:0.5];
[self.view addSubview:_cover];
self.cover.alpha = 0.0;
[self.cover addTarget:self action:@selector(smallImage:) forControlEvents:UIControlEventTouchUpInside];
}
return _cover; // 这里为什么不能能用self.cover
}
cover 和self.cover
:_cover是声明的时候就自动生成的,self是调用了自动生成的get语法。
:_cover是直接值访问,而self.cover是属性访问,就是通过get/set方法来读取这个值,xcode会默认将两个值通过syncthesize关键字进行同步。
a):if (self.cover == nil );逻辑上就行不通,因为你在这里调用self.cover他会再一次进入这个方法,理论上就会死循环(getter方法的循环调用)
而_cover是直接值访问的,他不会调用get/set方法,所以就不会有这个问题.
b):至于绿色的地方为什么可以就很好理解了吧,虽然他也会进入get方法,但是他已经不等于nil了.会直接返回他本身,所以没有问题.
c):今天遇到了一个奇葩的Bug,经过一番调试终于发现了问题的所在,发现竟然是使用懒加载的问题
如下面是一个自定义的cover示图的懒加载方法,当你调用[self.cover ……]后,此时 懒加载开始初始化,并返回cover实例对象,但是如果懒加载的代码还没有初始化完成并返回结果时,你再一次[self.cover ……],此时又会调用一次懒加载,这就导致了示图cover被初始化了两次,生成了两个cover实例,后果可想而知,真实太坑了,以后要注意了。
参考:
http://blog.sina.com.cn/s/blog_91c592f50102vs2k.html
http://www.jianshu.com/p/417d3a25aaf4
http://www.cnblogs.com/mancong/p/5051698.html
(0020)iOS 开发之-设计模式-懒加载解惑相关推荐
- iOS开发UI篇—懒加载
iOS开发UI篇-懒加载 1.懒加载基本 懒加载--也称为延迟加载,即在需要的时候才加载(效率低,占用内存小).所谓懒加载,写的是其get方法. 注意:如果是懒加载的话则一定要注意先判断是否已经有了, ...
- iOS开发UI中懒加载的使用方法
1.懒加载基本 懒加载--也称为延迟加载,即在需要的时候才加载(效率低,占用内存小).所谓懒加载,写的是其getter方法.说的通俗一点,就是在开发中,当程序中需要利用的资源时.在程序启动的时候不加载 ...
- ionic3开发系列——ionic3懒加载配置
配置ionic3懒加载步骤: 1.给需要懒加载的页面配置module.ts: 例:配置about.module.ts: import { NgModule } from '@angular/core' ...
- iOS开发swift版异步加载网络图片(带缓存和缺省图片)
iOS开发之swift版异步加载网络图片 与SDWebImage异步加载网络图片的功能相似,只是代码比较简单,功能没有SD的完善与强大,支持缺省添加图片,支持本地缓存. 异步加载图片的核心代码如下: ...
- iOS开发学无止境 - 异步图片加载优化与常用开源库分析
作者:罗轩(@luoyibu) 网址:http://www.jianshu.com/p/3b2c95e1404f 1. 网络图片显示大体步骤: 下载图片 图片处理(裁剪,边框等) 写入磁盘 从磁盘 ...
- ios开发多线程篇--异步加载网络图片GCD
一.异步加载网络图片 1.ATS (1)简介 从iOS9.0开始,如果按照以前的方式写代码,在访问网络的时候 ,会报以下警告信息: App Transport Security has blocked ...
- 关于swift中的懒加载
懒加载 在 iOS 开发中,懒加载是无处不在的 懒加载的格式如下: lazy var person: Person = {print("懒加载")return Person() } ...
- Vue项目开发中使用路由懒加载
Vue项目开发中使用懒加载 一.使用路由懒加载的好处 当打包项目时,JavaScript包会变的非常大,影响页面加载,要是通过把不同的路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应 ...
- ios加载本地html懒加载图片方案,IOS开发中加载大量网络图片优化方法
IOS开发中加载大量网络图片如何优化 1.概述 在IOS下通过URL读一张网络图片并不像其他编程语言那样可以直接把图片路径放到图片路径的位置就ok,而是需要我们通过一段类似流的方式去加载网络图片,接着 ...
最新文章
- Microsoft Teams快速上手系列-08Teams中的内部防火墙
- 开源一个SpringBoot + Mybatis + Vue的代码生成器
- http://blog.csdn.net/lovejavaydj/article/details/6
- Graphic Device
- MySql按字段分组取最大值记录
- ServletContextListener
- 网络安全等保定级_差异:关键信息基础设施与网络安全等级保护2.0
- 《软件工程》课程改进意见
- 买写真送手机系列 小米9王源限量版预售将在这些小米之家开启
- 关于估时间的一些感想
- oracle9i监听自动断开,oracle连接超时自动断开问题
- shell脚本编写笔记
- 聊聊Java中的System类
- MapReduce的Reducer类
- 微信的转账记录删除了还能恢复吗?2个办法教你找回
- 利用python处理pdf文本_Python用于NLP :处理文本和PDF文件
- 基于最大似然估计(matlab实验)
- Springboot整合SpringSecurity 04-启用登出logout功能
- Duilib版视频监控客户端(简易版)
- 单元格等于计算机日期,Excel相邻单元格快速填入相同日期的几种方法
热门文章
- 在Ubuntu上通过命令行安装Elisa KDE音乐播放器
- mydumper 0.6.2 安装,dba的必备备份工具,必须掌握
- N个免费DevOps开源工具,没用过,至少应该了解!
- 推荐2一个在Java编码过程中得心应手的工具
- DevExpress z
- 数列极限---和Gauss(取整)函数有关
- C# http post 地址
- ruby应用:puppet
- 数据库高可用性——SQL Server 2005数据库复制简单图解
- Google在中国打败百度的方法其实很简单.只要需改变5点.