Swift 懒加载(lazy) 和 Objective-C 懒加载的区别

在程序设计中,我们经常会使用 懒加载 ,顾名思义,就是用到的时候再开辟空间,比如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 的特性,为属性生成了getset方法,而这里是调用的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 = { [] }()
    //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-Cblock 或者对C语言的函数指针理解透彻的,可以看成是一个代码块,然后self.dataArray的时候,就执行了代码块,但是重复调用,Lazy 属性的代码块只会调用一次,lazy修饰的是一个存储属性,而存放的是闭包,我想内部,应该进行了优化

时间: 2024-09-29 20:50:29

Swift 懒加载(lazy) 和 Objective-C 懒加载的区别的相关文章

iOS 开发——实用技术Swift篇&amp;Swift 懒加载(lazy)

Swift 懒加载(lazy) 在程序设计中,我们经常会使用 * 懒加载 * ,顾名思义,就是用到的时候再开辟空间,比如iOS开发中的最常用控件UITableView,实现数据源方法的时候,通常我们都会这样写 Objective-C 1 //必须实现的数据源代理方法 2 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 3 { 4 return self.dataArr

Swift中懒加载(lazy initialization)的实现

Swift中是存在和OC一样的懒加载机制的,但是这方面国内的资料比较少,今天把搜索引擎换成了Bing后发现用Bing查英文\最新资料要比百度强上不少. 我们在OC中一般是这样实现懒加载初始化的: 1: @property (nonatomic, strong) NSMutableArray *players; 2:   3: - (NSMutableArray *)players { 4: if (!_players) { 5: _players = [[NSMutableArray alloc

懒加载 lazy loading

懒加载:延迟加载,当程序启动时不加载资源,当程序需要这些资源时再去加载.需要的时候再加载的一种方式,能够减少内存的占用,效率高.其本质是重写get方法. 背景:由于ios内存有限,如果我们一次性将所有资源加载完毕将极大的消耗内存,降低程序运行效率.所以就要将一些比较大的资源,如音频,数据,图片等大资源进行懒加载,就需要                                             先判断是否存在,如果不存在再创建实例化. 1 @property (nonatomic,

网页加载速度优化4--图片懒加载

当前网页设计理念主要以大气简洁主流(文艺小清新网站例外).更多的信息用图片来展示. 由于图片都是高清,所以会影响到网页加载速度.这里我们就用到图片的懒加载(延迟加载)功能. 最快速解决方案:jquery lazyload插件. Lazy Load 是一个用 JavaScript 编写的 jQuery 插件. 它可以延迟加载长页面中的图片. 在浏览器可视区域外的图片不会被载入, 直到用户将页面滚动到它们所在的位置. 这与图片预加载的处理方式正好是相反的. 在包含很多大图片长页面中延迟加载图片可以加

什么是hibernate懒加载?什么时候用懒加载?为什么要用懒加载?(转)

所谓懒加载(lazy)就是延时加载,延迟加载. 什么时候用懒加载呢,我只能回答要用懒加载的时候就用懒加载. 至于为什么要用懒加载呢,就是当我们要访问的数据量过大时,明显用缓存不太合适, 因为内存容量有限 ,为了减少并发量,减少系统资源的消耗, 我们让数据在需要的时候才进行加载,这时我们就用到了懒加载. 比如部门ENTITY和员工ENTITY,部门与员工1对多,如果lazy设置为 false,那么只要加载了一个部门的po,就会根据一对多配置的关系把所有员工的po也加载出来.但是实际上有时候只是需要

减少页面加载时间(感知或实际加载时间)的方法。

版权声明:本文为博主原创文章,未经博主允许不得转载. 1. 尽量减少页面中重复的HTTP请求数量 比较直接的理解就是要减少调用其他页面.文件的数量.我们在使用css格式控制的时候,经常会采用background载入很多图形文件,而每个background的图像都会产生1次HTTP请求,一般我们为了让页面生动活泼会大量使用background来加载背景图,要改善这个状况,可以采用css的1个有用的background-position属 性来加载背景图,我们将需要频繁加载的多个图片合成为1个单独的

JS 页面加载触发事件 document.ready和window.onload的区别

document.ready和onload的区别——JavaScript文档加载完成事件页面加载完成有两种事件: 一是ready,表示文档结构已经加载完成(不包含图片等非文字媒体文件): 二是onload,指示页面包含图片等文件在内的所有元素都加载完成. 1.Dom Ready 使用jq时一般都是这么开始写脚本的: $(function(){ // do something }); 例如: $(function() { $("a").click(function() { alert(&

jquery文档加载几种写法,图片加载写法

jquery文档加载写法: $(function(){ }) ; //个人最常使用方式 $(document).ready(function(){ }); //调用文档对象下的ready方法传入一个函数. $(window).load(function() { });//调用window对象下的load方法传入一个函数. (function() { })(jQuery)//()()表示立即执行 并且传入jquery = $ 所以之前$也可以替换为jQuery 注意: jquery的ready只是

未能加载视图状态。正在向其中加载视图状态的控件树必须与前一请求期间用于保存视图状态的控件树相匹配。例如,当以动态方式添加控件时,在回发期间添加的控件必须与在初始请求期间添加的控件的类型和位置相匹配

信息: 未能加载视图状态.正在向其中加载视图状态的控件树必须与前一请求期间用于保存视图状态的控件树相匹配.例如,当以动态方式添加控件时,在回发期间添加的控件必须与在初始请求期间添加的控件的类型和位置相匹配. 数据源: System.Web 堆栈信息: 在 System.Web.UI.Control.LoadViewStateRecursive(Object savedState) 在 System.Web.UI.Control.LoadChildViewStateByIndex(ArrayLis