Swift - lazy 修饰符和lazy 方法
延时加载
或者说延时初始化是很常用
的优化方法
,在构建和生成新的对象的时候,内存分配
会在运行时耗费
不少时间
,如果有一些对象的属性
和内容
非常复杂
的话,这个时间更不可忽略
。另外,有些情况下我们并不会立即
用到一个对象的所有属性,而默认情况下初始化时,那些在特定环境下不被使用的存储属性,也一样要被初始化和赋值,也是一种浪费
。
在其他语言(包括Objective-C)中延时加载
的情况是很常见
的。我们在第一次访问某个属性时,要判断
这个属性
背后的存储是否已经存在
,如果存在
则直接返回
,如果不存在
则说明是首次访问,那么就进行初始化并存储后再返回
。这样我们可以把这个属性的初始化时刻推迟,与包含它的对象初始化时刻分开,以达到提升性能的目的。以Objective-C举例如下(虽然这里既没有费时操作,也不会因为使用延时加载而影响性能,但是作为一个最简单的例子,可以很好的说明问题):
@interface Object ()@property (nonatomic, copy) NSString *testString;@end@implementation Object- (NSString *)testString {if (!_testString) {_testString = @"Hello";}return _testString;
}@end
在初始化Object 对象
后,_testString
是 nil
。只有当首次
访问testString 属性
时 getter方法
才会被调用,并检查
是否已经初始化
,如果没有的话,就进行赋值
。我们之后再多次访问这个属性的话,因为_testString
已经有值,因此直接返回
。
在Swift中我们使用在变量属性前加lazy 关键字
的方式来简单的指定延时加载
。比如上面的代码我们在Swift中重写的话,会是这样:
class ClassA {lazy var str: String = {let str = "Hello";print("只在首次访问输出")return str}()
}
我们在使用lazy
作为属性修饰符时,只能
声明属性是变量
。另外我们需要显式
的指定属性类型
,并使用一个可以对这个属性进行赋值的语句来在首次访问属性时运行。如果我们多次访问这个实例的str属性
的话,可以看到只有一次
输出。
为了简化,我们如果不需要做什么额外工作的话,也可以对这个lazy 的属性直接写赋值语句:
lazy var str: String = "Hello"
相比起在Objective-C中的实现方法,现在的lazy 使用起来要方便的多。
对于那些不需要完全运行,可能提前退出的情况,使用lazy
来进行性能优化
会非常有效。
Swift - lazy 修饰符和lazy 方法相关推荐
- 037——VUE中表单控件处理之表单修饰符:lazy/number/trim
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8" ...
- 表单下拉框、表单修饰符(.lazy、.number、.trim)
表单下拉框 知识点 v-model select 表单下拉框绑定 <div id="myApp"><h3>你最喜欢的NBA球星是:</h3>&l ...
- vue的lazy修饰符和number修饰符 、表单结构
目录 vue的lazy修饰符 vue的number修饰符 表单的构成 表单域 表单控件 vue的lazy修饰符 在默认情况下,v-model 在每次 input 事件触发后将输入框的值与数据进行同步 ...
- python @修饰符_python函数修饰符@的使用方法解析
python函数修饰符@的作用是为现有函数增加额外的功能,常用于插入日志.性能测试.事务处理等等. 创建函数修饰符的规则: (1)修饰符是一个函数 (2)修饰符取被修饰函数为参数 (3)修饰符返回一个 ...
- python修饰符的理解_python函数修饰符@的使用方法解析
这篇文章主要介绍了python函数修饰符@的使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 python函数修饰符@的作用是为现有函数增 ...
- Vue.js--表单修饰符(.lazy、.number、.trim)详解
.lazy 在输入框中,v-model默认是在input事件中同步输入框的数据(除了输入法中文输入的情况),使用修饰符 .lazy 会转变为 change 事件中同步(类似懒加载): <div ...
- JavaSE——面向对象进阶(封装、this、static、代码块、包、权限修饰符、main方法详解)
第2节 面向对象进阶 一.封装与private 概述: 封装的意义在于保护或者防止代码(数据)被我们无意中破坏.保护成员属性,不让类以外的程序直接访问和修改. 封装原则: 隐藏对象的属性和实现细节,仅 ...
- java默认修饰符_java默认方法的修饰符是什么
默认什么都不加,就是default(不用把default写出来). 意思就是只能由跟这个类在同一个包中的类来访问,比private限制更少,但比protected限制更多.' Java访问修饰符包括p ...
- java 中final修饰的变量_java中final修饰符的使用方法
本文为大家分享了java中final修饰符的使用,供大家参考,具体内容如下 1.final修饰符的用法: final可以修饰变量,被final修饰的变量被赋初始值之后,不能对它重新赋值. final可 ...
最新文章
- 全了!从Python入门到精通
- impala连接使用方法
- php-箭头r含义,php中-箭头的用法和意义
- 获取ini内容 GetPrivateProfileString GetPrivateProfileInt
- html和css如何制作小球,[网页设计]使用CSS3动画模拟实现小球自由落体效果
- 【转】Eclipse+CDT+Gcc编译选项控制
- 在Zuul中设置服务访问限流
- 解决 spring cloud git config 配置中心多环境问题
- 手机App常见功能测试点
- 单片机学习——看门狗
- 【问题解决】Linux服务器免密信任 远程执行
- OSChina 周二乱弹 ——我FFFF……佛慈悲
- Unity3D-VR《静夜诗》5-李白吟诗
- 和外国bi相比,国产bi软件更适合中国企业
- 各大电商API详细数据获取
- 自然语言处理之Word2Vec
- 婴儿围栏ASTM F406亚马逊CPC美国CPSIA认证玩具CPC认证儿童产品CPC认证
- 理论力学(静力学)-4-平面力偶系
- mpvue vue 长按录音,上滑取消,下拉恢复
- 微信公众号开发之如何将本机IP映射成外网域名