iOS应用一般在移动设备上运行,这类设备都有一个特点,就是计算能力和内存大小都不及普通计算机,所以为移动设备开发应用一定要以节省内存和计算资源作为出发点。
懒加载就是为了这种场景而诞生的,它是一种Swift的特殊语法,我们在不想使用这个特殊语法的时候也可以自己实现懒加载的机制。那什么是懒加载呢?从字面意思来解释,就是懒到最后一刻才加载,直到使用者要读取这个值的时候才初始化这个值,同时可能伴随一些计算逻辑。
因为懒加载会在一个不定的时间发生,并且懒加载的属性是会变化的,所以只能用var来定义一个懒加载的属性。在Person中,我们可以增加一个懒加载的ageDescription属性,类型是String,这个属性用来表示年龄的大小,示例如下:
只有程序第一次访问这个属性时才会赋值(在内存中占有一席之地)。这里使用了一个闭包的调用来给一个懒加载的属性赋值,其实是在获取这个属性值的时候运行的一段代码,并且需要返回最后给这个属性第一次赋的值。这个闭包会根据Person当时的年龄age给ageDescription进行赋值。这里要注意闭包最后的这对圆括号:如果没有圆括号,那么只是给这个变量赋值了一个闭包函数,有了圆括号,意味着这是一个闭包的调用。
回到main.swift中,增加打印personA的ageDescription:
只有程序第一次访问这个属性时才会赋值(在内存中占有一席之地)。这里使用了一个闭包的调用来给一个懒加载的属性赋值,其实是在获取这个属性值的时候运行的一段代码,并且需要返回最后给这个属性第一次赋的值。这个闭包会根据Person当时的年龄age给ageDescription进行赋值。这里要注意闭包最后的这对圆括号:如果没有圆括号,那么只是给这个变量赋值了一个闭包函数,有了圆括号,意味着这是一个闭包的调用。
回到main.swift中,增加打印personA的ageDescription:
控制台输出如下:(www.xing528.com)
控制台输出如下:
在打印完之后再次修改personA的属性值:
在打印完之后再次修改personA的属性值:
控制台输出如下:
控制台输出如下:
读者一定会觉得很奇怪,为什么ageDescription不再根据age属性进行改变了呢?这里要注意一个很重要的知识点,懒加载的属性一旦执行过闭包函数之后,就不会再执行了,它是个一次性的行为。那如果要做到实时的变化怎么办?那就要使用属性的get方法。
读者一定会觉得很奇怪,为什么ageDescription不再根据age属性进行改变了呢?这里要注意一个很重要的知识点,懒加载的属性一旦执行过闭包函数之后,就不会再执行了,它是个一次性的行为。那如果要做到实时的变化怎么办?那就要使用属性的get方法。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。