文档章节

swift懒加载(lazy load)VS OC懒加载

zh_iOS
 zh_iOS
发布于 2016/12/29 14:21
字数 637
阅读 372
收藏 0

懒加载可以让你不用关心变量的创建时机,等到真正使用的时候才去创建并且能保证在使用的时候已经初始化完毕,在一定程度上可以提高性能。

OC懒加载的原理:

重写变量的 getter 方法,在getter方法里判断变量 if 变量 == nil 则初始化变量 ,否则直接返回已经初始化完毕的变量,所以我们在调用懒加载的变量时 一定要使用 self.变量名(通过getter方法取值)。 

话不多说先看一段OC懒加载实现:

- (UICollectionViewFlowLayout *)flowLayout {
    if (!_flowLayout) {
        _flowLayout = [[UICollectionViewFlowLayout alloc] init];
        _flowLayout.scrollDirection = UICollectionViewScrollDirectionHorizontal;
        _flowLayout.minimumInteritemSpacing = 0;
        _flowLayout.minimumLineSpacing = 0;
    }
    return _flowLayout;
}

我们在调用 self.flowLayout 的时候其实就是在调用变量的 getter 方法。

再看swift 中的懒加载实现:

lazy var dataSource = Array<String>()

简单暴力一行代码就可以实现。

如果你想给延迟加载变量加一些初始化或者逻辑处理操作,可以在变量后面加一个闭包调用(闭包的返回值就是变量的默认值)

    lazy var tableView: UITableView = {
        let tempTableView = UITableView (frame: self.view.bounds, style: .plain)
        tempTableView.delegate = self
        tempTableView.dataSource = self
        tempTableView.register(UITableViewCell.self, forCellReuseIdentifier: cellID)
        return tempTableView
    }()

 

( ps:如果你在coding过程中遇到这么个错误,或者是类似的错误,那么是因为你的 ViewController 没有遵守相应的代理导致的。

class ViewController: UIViewController,UITableViewDataSource,UITableViewDelegate {
   // ...
}

遵守代理后就可以解决问题。 

Cannot assign value of type 'ViewController' to type 'UITableViewDataSource?'

 

也可以实例方法来初始化延迟加载变量:

    func initArray() -> Array<String> {
        return ["1","2","3"]
    }
    lazy var dataArray: Array<String> = self.initArray()

也可以使用类方法:

    class func initDataArray() -> Array<String> {
        return ["1","2","3"]
    }
    lazy var dataArray: Array<String> = ViewController.initDataArray()

 推荐使用在变量后面直接加闭包调用这种写法,代码更加紧凑直观。

swift lazy 变量 只能用 var 关键字来修饰,因为常量必须在实例创建时赋值  。与OC中不同,OC中懒加载变量可以置 nil ,当再次调用的时候依然会重新初始化。因为swift 中 nil 和 OC nil 含义不同(OC中代表空指针,向空指针发送消息不会崩溃,swift 中 nil 代表的是 值缺失 。)所以swift 中懒加载的变量 = nil 时 就相当于直接给他赋值成 nil 了,再次调用该变量时其值就是 nil ,而不会像 OC 中懒加载一样再次初始化!

以上就是 swift 和 OC 中懒加载总结和对比,如果问题欢迎指正。 

© 著作权归作者所有

上一篇: iOSRunLoop详解
zh_iOS
粉丝 27
博文 80
码字总数 36662
作品 0
石景山
程序员
私信 提问
懒加载 & 存储型属性 & 计算型属性

懒加载 swift中也有懒加载的方式 OC不同的是swift有专门的关键字来实现懒加载 懒加载的格式 懒加载的使用 存储型属性 需要开辟空间,以存储数据 计算型属性 执行函数返回其他内存地址 只实现...

iOS袭锐
2018/05/18
0
0
getter & setter & private & get only 属性

// Person.swift import UIKit class Person: NSObject { // -- getter & setter 方法在 Swift 中极少用,仅供参考 // OC 中利用 getter 方法,编写懒加载,而 Swift 中提供了 lazy // 如果不...

TaciturnKnightYQ
2015/12/04
27
0
Swift的基本使用介绍

如果你会Object-C,也会Swift,那么这个你必看 Swift和OC文件间的相互调用 计时器调用的方法不能用private修饰 Swift除了闭包不需要用self. Swift中的方法 Swift中定义全局属性 Swift中敲击手势...

阴雨音语
2016/03/28
72
0
Swift构造函数

1.构造函数: 给属性开辟内存空间 给属性设置初始值 最终目标创建一个对象 用init构造函数 参数有可能不同 (1)//定义属性使用var 是我们开发需要的 var name: String //可选属性 - 默认等...

KevinEmily
2016/03/06
69
0
Hibernate懒加载

面试题: get、load方法区别? get: 及时加载,只要调用get方法立刻向数据库查询 load:默认使用懒加载,当用到数据的时候才向数据库查询。 懒加载:(lazy) 概念:当用到数据的时候才向数据库...

爪哇程序猿
2015/10/22
170
0

没有更多内容

加载失败,请刷新页面

加载更多

教你玩转Linux—添加批量用户

添加和删除用户对每位Linux系统管理员都是轻而易举的事,比较棘手的是如果要添加几十个、上百个甚至上千个用户时,我们不太可能还使用useradd一个一个地添加,必然要找一种简便的创建大量用户...

xiangyunyan
16分钟前
3
0
返回提示信息,如:xxx创建成功!

【服务端】在输出的方法块中,加入要输出的字段(qcm_batch_id) QCMUserType.cs: public struct QCM_Custom_Create_Batch_Out_Tag { public BASCoreType.Cmn_Out_T......

_Somuns
16分钟前
3
0
Aliyun Serverless VSCode Extension v1.12.0 发布

Aliyun Serverless VSCode Extension 是阿里云 Serverless 产品 函数计算 Function Compute 的 VSCode 插件,该插件结合了函数计算 Fun 工具以及函数计算 SDK ,是一款 VSCode 图形化开发调试...

阿里云官方博客
16分钟前
4
0
程序员如何培养解决复杂问题的能力?

今天在上网时候,突然看到了这篇文章,感觉非常的适合现在的自己去思考下,可能也适用在座的读者。程序员不仅仅是敲代码,更是一个复合能力的结合体,也不仅仅停留在技术和代码阶段。你想要成...

哥本哈根的小哥
20分钟前
6
0
市场变化驱动产品思维升级

宜信科技中心财富管理产品部负责人Bob,与大家一起聊聊个性化推荐产品功能的设计和B端产品的功能策划方式。 拓展阅读:回归架构本质,重新理解微服务 智慧金融时代,大数据和AI如何为业务赋能...

宜信技术学院
21分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部