这儿每天共享一个 iOS 的新知识,快来重视我吧
前语
Swift 开发者必定都用过 lazy
关键字,它允许推迟特点的初始化,直到它们第一次被拜访。这一特性在很多场景都特别有用,比如初始化高内存目标,合理利用 lazy
能有效提升运用的功能和资源利用率。
今日来讲讲 lazy
关键字的运用场景和完成原理。
运用场景
场景一:推迟加载重量级目标
在许多运用中,某些目标的创立或许十分耗时,例如从数据库加载很多数据或进行复杂的核算。假如这些目标在发动时就被当即初始化,一方面或许会占用不必要的内存,另一方面或许会延长运用的发动时刻。
classDatabaseManager{
lazyvardatabaseConnection:DatabaseConnection={
print("创立数据库链接...")
returnDatabaseConnection()
}()
}
letmanager=DatabaseManager()
print("DatabaseManager初始化成功")
//在这一行拜访databaseConnection之前,数据库连接不会被创立
print(manager.databaseConnection)
场景二:依靠于其他特点的初始化
有的时候,一个特点的初始化或许依靠于目标中其他特点的值,而这些特点或许在目标初始化时尚未准备好,举个例子,用户信息中 fullName
特点依靠 firstName
和 lastName
特点,所以 fullName 需求运用 lazy
。
classUserProfile{
letfirstName:String
letlastName:String
lazyvarfullName:String={
return"(firstName)(lastName)!"
}()
init(firstName:String,lastName:String){
self.firstName=firstName
self.lastName=lastName
}
}
letprofile=UserProfile(firstName:"John",lastName:"Doe")
print(profile.fullName)//运用时才进行初始化
场景三:条件性资源加载
在某些情况下,目标的某些部分或许只在特定条件下才需求被加载。运用 lazy
能够确保只要在真实需求时才加载这些资源,从而节省内存和核算资源。
classFeatureManager{
lazyvaradvancedFeature:AdvancedFeature={
print("Loadingadvancedfeature...")
returnAdvancedFeature()
}()
}
letfeatureManager=FeatureManager()
//只要在满意某些条件时才拜访advancedFeature,触发其加载
ifuserHasAccessToAdvancedFeatures{
print(featureManager.advancedFeature)
}
lazy
关键字的底层完成
在 Swift 源码中,lazy
的完成细节能够在 Lazy.h[1] 文件中找到。简单解释一下这份 C++ 代码:
-
创立了两个模版类:
LazyValue
用来存储懒加载值,Lazy
用来创立懒加载全局目标。 -
推迟初始化:
LazyValue
在调用 get 方法时会先调用Value.has_value()
方法查看是否初始化过,假如没有,则调用Init()
来初始化目标。 -
一次性赋值: 一旦
lazy
特点被初始化,其值就会被存储起来,后续的拜访将直接回来该值,无需重新核算。
需求注意的是,假如多个线程一起拜访标有修饰符的 lazy
特点,并且该特点尚未初始化时,则不能保证该特点将仅初始化一次。
结论
Swift 中的 lazy
关键字提供了一种强大且灵活的方法来优化运用的功能和资源运用。经过推迟初始化,lazy
特点能够削减不必要的核算,提高运用发动速度,并按需加载资源。深入了解 lazy
的底层完成不仅有助于更好地利用这一特性,还能增进对 Swift 编译器和运行时行为的理解。
参考资料
[1]
Lazy.h: github.com/apple/swift…
本文同步自微信大众号 “iOS新知”,每天按时共享一个新知识,这儿仅仅同步,想要及时学到就来重视我吧!