iOS 开发——实用技术Swift篇&Swift 懒加载(lazy)
Swift 懒加载(lazy)
在程序设计中,我们经常会使用 * 懒加载 * ,顾名思义,就是用到的时候再开辟空间,比如iOS开发中的最常用控件UITableView,实现数据源方法的时候,通常我们都会这样写
Objective-C
//必须实现的数据源代理方法
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.dataArray.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//1.得到cell
XWShopCell *cell = [XWShopCell cellWithTableView:tableView];
//2.传递模型
cell.wine = self.dataArray[indexPath.row];
//3.回传cell
return cell;
}
上面的的代码中
return self.dataArray.count;
其实就是利用
@property (nonatomic, strong) NSArray *dataArray;
@property 的特性,为属性生成了get和set方法,而这里是调用的get方法,但是上述代码中 return self.dataArray.count 会调用
- (NSArray *)dataArray
{
return _dataArray
}
这样调用,如果成员属性dataArray 开始没有赋值的,那么在使用的时候,调用get方法,不重写的话,会报错,空指针,所以一般我们会重写get方法
//重写get方法
- (NSArray *)dataArray
{
if (nil == _dataArray){
_dataArray = [NSArray array];
}
return _dataArray
}
这样写,就防止了成员属性为没有赋值的情况
- 综上所述,Objective-C的懒加载,其实就是调用成员属性的get方法,初始化值,而Swift的懒加载,是和Objective-C不同的
Swift
//MARK tablview的 dataSource 代理方法
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
return self.dataArray.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{
//1.得到cell
let cell = XWShopCell.cellWithTableView(tableView)
//2.传递模型
cell.wine = self.dataArray[indexPath.row]
//3.回传cell
return cell
}
- 而这句
return self.dataArray.count
- 在Swift 存储属性必须初始化,确认类型,或者用可选类型,总之要确认类型,毕竟Swfit是类型安全语言,所以Swift提出了lazy属性,用法
//1.分析 NSArray 是一个闭包的返回值,而这是一个没有参数的闭包
lazy var dataArray:NSArray = {
return []
}()
//2.也可以写成这样
lazy var dataArray:NSArray = {
return NSArray()
}()
//3.从plist文件加载
lazy var dataArray:Array<XWWine> = {
let winePath = NSBundle.mainBundle().pathForResource("wine.plist", ofType: nil)!
let winesM = NSMutableArray(contentsOfFile: winePath);
var tmpArray:Array<XWWine>! = []
for tmpWineDict in winesM! {
var wine:XWWine = XWWine.wineWithDict(tmpWineDict as! NSDictionary)
tmpArray.append(wine)
}
print("我就运行一次")
return tmpArray
}()
上述的代码,有点难理解,如果之前会Objective-C的block 或者对C语言的函数指针理解透彻的,可以看成是一个代码块,然后self.dataArray的时候,就执行了代码块,但是重复调用,Lazy 属性的代码块只会调用一次,lazy修饰的是一个存储属性,而存放的是闭包,我想内部,应该进行了优化
个人愚见,内部有一个静态的存储空间,当空间没值的时候,就会执行闭包代码,return 返回值后,就会放到这个存储空间内,有点像Objective-C的单例对象.
- 欢迎转载,但请保留原地址boyXiong(大神:雄伟)
iOS 开发——实用技术Swift篇&Swift 懒加载(lazy)的更多相关文章
- Swift - 懒加载(lazy initialization)
Swift中是存在和OC一样的懒加载机制的,在程序设计中,我们经常会使用 懒加载 ,顾名思义,就是用到的时候再开辟空间 懒加载 格式: lazy var 变量: 类型 = { 创建变量代码 }() 懒 ...
- Swift中懒加载(lazy initialization)的实现
Swift中是存在和OC一样的懒加载机制的,但是这方面国内的资料比较少,今天把搜索引擎换成了Bing后发现用Bing查英文\最新资料要比百度强上不少. 我们在OC中一般是这样实现懒加载初始化的: 1: ...
- IOS 开发下拉刷新和上拉加载更多
IOS 开发下拉刷新和上拉加载更多 简介 1.常用的下拉刷新的实现方式 (1)UIRefreshControl (2)EGOTTableViewrefresh (3)AH3DPullRefresh ( ...
- 【Android】再来一篇Fragment懒加载(只加载一次哦)
效果 老规矩,先来看看效果图 没错,我又入坑了,又重新做了个 Gank 客户端,因为之前那个代码写得太烂了,这次有好好的考虑了下架构之类的事,代码应该会更容易读懂了点了,吧.哈哈,再次欢迎来 star ...
- 黑马程序员-懒加载 lazy loading
懒加载:延迟加载,当程序启动时不加载资源,当程序需要这些资源时再去加载.需要的时候再加载的一种方式,能够减少内存的占用,效率高.其本质是重写get方法. 背景:由于ios内存有限,如果我们一次性将所有 ...
- JPA数据懒加载LAZY和实时加载EAGER(二)
懒加载LAZY和实时加载EAGER的概念,在各种开发语言中都有广泛应用.其目的是实现关联数据的选择性加载,懒加载是在属性被引用时,才生成查询语句,抽取相关联数据.而实时加载则是执行完主查询后,不管是否 ...
- JPA数据懒加载LAZY和实时加载EAGER(转)
原文:https://www.cnblogs.com/MrSi/p/8081811.html 懒加载LAZY和实时加载EAGER的概念,在各种开发语言中都有广泛应用.其目的是实现关联数据的选择性加载, ...
- JPA数据懒加载LAZY配合事务@Transactional使用(三)
上篇博文<JPA数据懒加载LAZY和实时加载EAGER(二)>讲到,如果使用懒加载来调用关联数据,必须要保证主查询session(数据库连接会话)的生命周期没有结束,否则,你是无法抽取到数 ...
- iOS开发UI篇-懒加载、重写setter方法赋值
一.懒加载 1.懒加载定义 懒加载——也称为延迟加载,即在需要的时候才加载(效率低,占用内存小).所谓懒加载,写的是其get方法. 注意:如果是懒加载的话则一定要注意先判断是否已经有了,如果没有那么再 ...
随机推荐
- js中location.search、split()HTML5中localStorage
1. location.search在客户端获取Url参数的方法 location.search是从当前URL的?号开始的字符串 如:http://www.baidu.com/s?wd=baidu&a ...
- PHP强大的内置filter (二) 完
<?php #Sanitize filters #Sanitize filters 可以清理掉不规范的字符 # FILTER_SANITIZE_EMAIL 可以清理除了 字母和数字 以及 !#$ ...
- WS之cxf简单实现
1.服务端实现: 1.1 定义接口,用@WebService修饰: /** @WebService 所修饰的接口,那么接口里面的方法全部都属于web的服务 */ @WebService public ...
- POJ2406----Power Strings解题报告
Power Strings Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 43514 Accepted: 18153 D ...
- JIT(动态编译)和AOT(静态编译)编译技术比较
Java 应用程序的性能经常成为开发社区中的讨论热点.因为该语言的设计初衷是使用解释的方式支持应用程序的可移植性目标,早期 Java 运行时所提供的性能级别远低于 C 和 C++ 之类的编译语言.尽管 ...
- Innodb中的事务隔离级别和锁的关系(转)
原文:http://tech.meituan.com/innodb-lock.html 前言: 我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁这种方式.同时数据库 ...
- 关于Ext.NET Demo程序在IIS7.5部署出现"Ext未定义"的解决方案
有以下三点 1.应用程序池请用ASP.NET4.0经典模式 2.安装ASP.NET 控制面板-->程序和功能-->打开或关闭WIndows功能-->Internet信息服务--& ...
- UVALive 7147 World Cup
https://icpcarchive.ecs.baylor.edu/index.phpoption=com_onlinejudge&Itemid=8&page=show_proble ...
- 用来用去还是觉得SDCMS好用
用来用去还是觉得SDCMS好用 现在可以算是精通了.呵呵,欢迎交流
- 100个直接可以拿来用的JavaScript实用功能代码片段(转载)
把平时网站上常用的一些实用功能代码片段通通收集起来,方面网友们学习使用,利用好的话可以加快网友们的开发速度,提高工作效率. 目录如下: 1.原生JavaScript实现字符串长度截取2.原生JavaS ...