这儿每天共享一个 iOS 的新知识,快来重视我吧

前语

Swift 开发者必定都用过 lazy 关键字,它允许推迟特点的初始化,直到它们第一次被拜访。这一特性在很多场景都特别有用,比如初始化高内存目标,合理利用 lazy 能有效提升运用的功能和资源利用率。

今日来讲讲 lazy 关键字的运用场景和完成原理。

运用场景

场景一:推迟加载重量级目标

在许多运用中,某些目标的创立或许十分耗时,例如从数据库加载很多数据或进行复杂的核算。假如这些目标在发动时就被当即初始化,一方面或许会占用不必要的内存,另一方面或许会延长运用的发动时刻。

classDatabaseManager{
lazyvardatabaseConnection:DatabaseConnection={
print("创立数据库链接...")
returnDatabaseConnection()
}()
}
letmanager=DatabaseManager()
print("DatabaseManager初始化成功")
//在这一行拜访databaseConnection之前,数据库连接不会被创立
print(manager.databaseConnection)

场景二:依靠于其他特点的初始化

有的时候,一个特点的初始化或许依靠于目标中其他特点的值,而这些特点或许在目标初始化时尚未准备好,举个例子,用户信息中 fullName 特点依靠 firstNamelastName 特点,所以 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++ 代码:

  1. 创立了两个模版类:LazyValue 用来存储懒加载值,Lazy 用来创立懒加载全局目标。

  2. 推迟初始化: LazyValue 在调用 get 方法时会先调用 Value.has_value() 方法查看是否初始化过,假如没有,则调用 Init() 来初始化目标。

  3. 一次性赋值: 一旦 lazy 特点被初始化,其值就会被存储起来,后续的拜访将直接回来该值,无需重新核算。

需求注意的是,假如多个线程一起拜访标有修饰符的 lazy 特点,并且该特点尚未初始化时,则不能保证该特点将仅初始化一次。

结论

Swift 中的 lazy 关键字提供了一种强大且灵活的方法来优化运用的功能和资源运用。经过推迟初始化,lazy 特点能够削减不必要的核算,提高运用发动速度,并按需加载资源。深入了解 lazy 的底层完成不仅有助于更好地利用这一特性,还能增进对 Swift 编译器和运行时行为的理解。

参考资料

[1]

Lazy.h: github.com/apple/swift…

本文同步自微信大众号 “iOS新知”,每天按时共享一个新知识,这儿仅仅同步,想要及时学到就来重视我吧!