swift懒加载(lazy load)VS OC懒加载
为什么80%的码农都做不了架构师?>>>
懒加载可以让你不用关心变量的创建时机,等到真正使用的时候才去创建并且能保证在使用的时候已经初始化完毕,在一定程度上可以提高性能。
OC懒加载的原理:
重写变量的 getter 方法,在getter方法里判断变量 if 变量 == nil 则初始化变量 ,否则直接返回已经初始化完毕的变量,所以我们在调用懒加载的变量时 一定要使用 self.变量名(通过getter方法取值)。
话不多说先看一段OC懒加载实现:
- (UICollectionViewFlowLayout *)flowLayout {if (!_flowLayout) {_flowLayout = [[UICollectionViewFlowLayout alloc] init];_flowLayout.scrollDirection = UICollectionViewScrollDirectionHorizontal;_flowLayout.minimumInteritemSpacing = 0;_flowLayout.minimumLineSpacing = 0;}return _flowLayout;
}
我们在调用 self.flowLayout 的时候其实就是在调用变量的 getter 方法。
再看swift 中的懒加载实现:
lazy var dataSource = Array<String>()
简单暴力一行代码就可以实现。
如果你想给延迟加载变量加一些初始化或者逻辑处理操作,可以在变量后面加一个闭包调用(闭包的返回值就是变量的默认值)
lazy var tableView: UITableView = {let tempTableView = UITableView (frame: self.view.bounds, style: .plain)tempTableView.delegate = selftempTableView.dataSource = selftempTableView.register(UITableViewCell.self, forCellReuseIdentifier: cellID)return tempTableView}()
( ps:如果你在coding过程中遇到这么个错误,或者是类似的错误,那么是因为你的 ViewController 没有遵守相应的代理导致的。
class ViewController: UIViewController,UITableViewDataSource,UITableViewDelegate {// ...
}
遵守代理后就可以解决问题。
Cannot assign value of type 'ViewController' to type 'UITableViewDataSource?'
)
也可以实例方法来初始化延迟加载变量:
func initArray() -> Array<String> {return ["1","2","3"]}lazy var dataArray: Array<String> = self.initArray()
也可以使用类方法:
class func initDataArray() -> Array<String> {return ["1","2","3"]}lazy var dataArray: Array<String> = ViewController.initDataArray()
推荐使用在变量后面直接加闭包调用这种写法,代码更加紧凑直观。
swift lazy 变量 只能用 var 关键字来修饰,因为常量必须在实例创建时赋值 。与OC中不同,OC中懒加载变量可以置 nil ,当再次调用的时候依然会重新初始化。因为swift 中 nil 和 OC nil 含义不同(OC中代表空指针,向空指针发送消息不会崩溃,swift 中 nil 代表的是 值缺失 。)所以swift 中懒加载的变量 = nil 时 就相当于直接给他赋值成 nil 了,再次调用该变量时其值就是 nil ,而不会像 OC 中懒加载一样再次初始化!
以上就是 swift 和 OC 中懒加载总结和对比,如果问题欢迎指正。
转载于:https://my.oschina.net/zhxx/blog/814584
swift懒加载(lazy load)VS OC懒加载相关推荐
- Angular Lazy load(延迟加载,惰性加载) 机制和 feature module 的学习笔记
官网链接 默认情况下,NgModules 是贪婪加载的,这意味着一旦应用程序加载,所有 NgModules 也会加载,无论它们是否立即需要. 对于有很多路由的大型应用程序,可以考虑延迟加载--一种根据 ...
- SAP Fiori里的List是如何做到懒加载Lazy load的
今天一同事问我这个问题:S/4HANA Fiori应用里的列表,一旦Scroll到底部就会自动向后台发起新的请求把更多的数据读取到前台显示. 以Product Master这个应用为例,我点击搜索之后 ...
- swift_043(Swift 懒加载(lazy) )
懒加载的优点 懒加载(lazy load),其实是延时加载,它的优点显而易见,首先,懒加载将对象的创建延迟到了需要对象的时候,这样减少了内存开销:其次,懒加载将创建对象.相关属性设置内聚在一个&quo ...
- Lazy Load, 延迟加载图片的 jQuery 插件 - NeoEase
Lazy Load, 延迟加载图片的 jQuery 插件 - NeoEase Lazy Load 是一个用 JavaScript 编写的 jQuery 插件. 它可以延迟加载长页面中的图片. 在浏览器 ...
- Lazy Load, 延迟加载图片的 jQuery 插件
Lazy Load 是一个用 JavaScript 编写的 jQuery 插件. 它可以延迟加载长页面中的图片. 在浏览器可视区域外的图片不会被载入, 直到用户将页面滚动到它们所在的位置. 这与图片预 ...
- 延迟加载图片 Lazy Load
Lazy Load 是一个用 JavaScript 编写的 jQuery 插件. 它可以延迟加 载长页面中的图片 . 在浏览器可视区域外的图片不会被载入, 直到用户将页面滚动到它们所在的位置. 这与图 ...
- 14 代码分割之lazy:Suspense与路由懒加载
lazy内置方法 Suspense内置组件 lazy是React提供的懒(动态)加载组件的方法,React.lazy() 能减少打包体积.延迟加载首屏不需要渲染的组件 依赖内置组件Suspense:给 ...
- react中使用lazy函数进行路由懒加载
react中使用lazy函数进行路由懒加载 import React, { Component,lazy,Suspense} from 'react' //1.通过React的lazy函数配合impo ...
- 什么是hibernate懒加载?什么时候用懒加载?为什么要用懒加载?
所谓懒加载(lazy)就是延时加载,延迟加载. 什么时候用懒加载呢,我只能回答要用懒加载的时候就用懒加载. 至于为什么要用懒加载呢,就是当我们要访问的数据量过大时,明显用缓存不太合适, 因为内存容量有 ...
最新文章
- 串的堆分配存储c语言,数据结构c语言串的堆分配存储源程序
- excel pandas 空格_Pandas写入excel:1)索引中的空白行;2)每天保存索引
- nginx php win平台配置
- 数据库mysql中delimiter的作用和用法
- 第2章 Python 数字图像处理(DIP) --数字图像基础4 -- 像素间的一些基本关系 - 邻域 - 距离测试
- c++ sleep函数_《PHP扩展开发》-hook-(hook原来的sleep)
- 利用fiddler给android模拟器抓包
- Oracle分页排序采坑记录
- java接收并存储文件_客户端读取本地文件的数据,发送到服务器,服务器接收并存储到文件中...
- 3.15 曝光:40 亿 AI 骚扰电话和 11 家合谋者
- (转)使用Flexible实现手淘H5页面的终端适配
- android+解锁工具,安卓手机解锁助手 (A Unlock Tool)
- 你不知道的华为交换机22个实用技巧
- 世界名著100部简介
- 【沃顿商学院学习笔记】商业基础——Financing:05 名义利率和实际利率 APR EAR
- jsp、html通过添加注册表打开本地应用
- 【AS】Android stdio运行APP闪退或keeps stopping
- 图像的对比度、亮度、色彩饱和度调节以及灰度化
- LVGL (7) 显示对接
- Linux 硬件加速 开源人脸识别引擎SeetaFace:第二步在ZedBoard上运行