我是初学者,我有点理解Lazy Var vs. Let.我注意到,当使用Lazy Var时,特别是使用ImageViews,可以节省大量的内存使用量.但是到目前为止我看过的教程和指南并没有经常使用Lazy Var,所以我很怀疑它是不好的做法而且我忽略了一些东西.
我做了一点研究,得知Lazy不是"线程安全",但我不明白这意味着什么.我已经看到了很多优点和缺点,但我无法得出任何结论,特别是因为我的知识非常有限.
什么时候(或更好)在创建UIView时使用Lazy Var vs. Let?
lazy var profileImageView: UIImageView = {
let imageView = UIImageView(image: #imageLiteral(resourceName: "page1"))
imageView.translatesAutoresizingMaskIntoConstraints = false
imageView.contentMode = .scaleAspectFit
return imageView
}()
Run Code Online (Sandbox Code Playgroud)
是否使用lazy var取决于代码及其上下文。它本身并不坏也不是好。您必须决定什么时候合适。
在做出决定之前,您必须先知道是什么lazy var。
什么lazy var啊
延迟初始化是一个概念,其中可变内容的初始化(构造)被延迟到第一次使用。首次访问此类变量会触发初始化。由于只有在使用(需要)使用延迟初始化变量的变量之后才创建内容,因此可以节省资源。
那是延迟初始化的主要驱动力。在需要之前,您不会创建任何东西。这也是您在决定是否应该使用某些东西时的逻辑lazy var。
如果您要处理始终可见(需要)的视图(或其他视图),那么使用惰性初始化几乎没有意义。另一方面,当您处理并非总是需要的实例时,则使用lazy var是合理的。
如果您的视图在所显示的视图控制器中始终可见,那么通过使其变得懒惰就不会做很多事情。如果仅在特定情况下可见(例如,当用户展开某些折叠面板时),则使其变得懒惰才有意义。默认情况下,它将使您的视图控制器加载速度更快,并使用更少的内存。
就线程安全而言,lazy var在Swift中不是线程安全的。
这意味着,如果两个不同的线程尝试同时访问同一线程lazy var,则在初始化该变量之前,线程之一可能会访问部分构造的实例。
您可以在以下位置找到有关线程安全性的更多信息:
使用a的另一个好处lazy var是可以提高代码的可读性。
在您的示例中,与图像视图相关的代码被分组在一起,而不是散布到初始化程序,设置函数或viewDidLoad。通过不要求代码阅读者冒险去遍历代码中的各个地方来了解您的视图的配置方式,从而改善了本地推理。要了解您的观点,他们只需要跳转到其声明即可。
标记为lazy varcan access 的初始化闭包self允许在闭包内部进行更多配置,例如添加目标操作或引用其他常量属性。
我认为使用闭包来初始化属性(尤其是视图)lazy var是一种好习惯,并且似乎在Swift社区中也越来越流行。
根据项目的不同,节省开发人员时间比节省系统内存更有价值。
使用惰性变量可以解决一个矛盾的问题:您想要创建一个具有子视图的自定义视图,这些子视图的初始化引用父视图。
例如,如果要创建包含相同大小的子 UIScrollView 的 UIView 子类,则不能声明包含以下内容的类:
var m_scrollView: UIScrollView
override init(frame: CGRect)
{
m_scrollView = UIScrollView(frame: self.frame)
super.init(frame: frame)
}
Run Code Online (Sandbox Code Playgroud)
编译器会抱怨你在调用 super.init 之前引用了 self。但是... super.init 必须在所有成员初始化后调用。
这个循环问题的解决方案是使 m_scrollView 变得惰性并在其声明中初始化它:
lazy var m_scrollView = UIScrollView(frame: self.frame)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2772 次 |
| 最近记录: |