iOS中的懒加载

iOS开发中 我们经常使用懒加载

1.懒加载的好处,让控件和对象在最需要加载的时候加载。这样可以节省内存空间,因为我们移动的设备资源还是比较宝贵的。所谓懒加载 就是推迟他的getter方法的执行。

比如。一个view的子控件 ,只有当这个view被显示的时候才去加载。一个tableViewCell中,给他设置了图片,他的content View里面才包含imageView的图片,只有设置了textLabel的内容,才会加载这个textLabel.

//collectionView的数据源--属性申明

@property (nonatomic,
strong) NSArray *famouseDoctorArr;

//懒加载

-(NSArray *)famouseDoctorArr{

if (_famouseDoctorArr ==
nil) {

_famouseDoctorArr =[FDFamousDoctorsTong
famousDoctorsTongArr];

}

return
_famouseDoctorArr;

}

// collectionView的懒加载属性申明

@property (nonatomic,
strong) UICollectionView *collectionView;

-(UICollectionView *)collectionView{

if (_collectionView ==
nil) {

_collectionView = [[UICollectionView
alloc]initWithFrame:CGRectZero
collectionViewLayout:self.layout];

_collectionView.backgroundColor =[UIColor
orangeColor];

// 指定代理

_collectionView.dataSource =
self;

_collectionView.delegate =
self;

//注册cell

//    [self.collectionView registerClass:[FDIllCollectionViewCell class] forCellWithReuseIdentifier:@"illCell"];

[_collectionView
registerNib:[UINib
nibWithNibName:@"FDIllCollectionViewCell"
bundle:nil]
forCellWithReuseIdentifier:@"illCell"];

}

return
_collectionView;

}

-----说说我今天在懒加载中遇到的问题

//1.0---我的illView中 collection View中的 cell被点击了。

-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{

//把模型传递给下一个控制器

FDFamousDoctorsTong *famouseDoctorTong =
self.famouseDoctorArr[indexPath.item];

if (indexPath.item ==
self.famouseDoctorArr.count -
1) {

NSLog(@"加载公益活动界面");

}else{

//跳转到疾病选择控制器 --通知主页控制器切换

if ([self.delegate
respondsToSelector:@selector(illViewDidSelectItem:)]) {

[self.delegate
illViewDidSelectItem:famouseDoctorTong];

}

}

}

// 在获取这个illView中控制器中实现代理方法

#pragma mark - 疾病视图cell被点击的回调代理方法  ---执行跳转方法 传递模型

-(void)illViewDidSelectItem:(FDFamousDoctorsTong *)famouseDodctorTong{

//
从storyBoard里面加载Controller

UIStoryboard *sb =[UIStoryboard
storyboardWithName:@"FDIllDetailViewController"
bundle:nil];

//FDIllDetailViewController *detailVc =[sb instantiateViewControllerWithIdentifier:@"detailVC"];

FDIllDetailViewController *detailVc = sb.instantiateInitialViewController;

detailVc.title =
@"疾病选择详情";

detailVc.famousDoctorsTong = famouseDodctorTong;

detailVc.view.backgroundColor =[UIColor
colorWithRed:241/255.0
green:241/255.0
blue:241/255.0
alpha:1.0];

[self.navigationController
pushViewController:detailVc animated:YES];

}

//3.0重写模型的setter方法給控件的属性赋值

#pragma mark - 从主页控制器点击疾病跳转的得到参数重写模型的setter方法

-(void)setFamousDoctorsTong:(FDFamousDoctorsTong *)famousDoctorsTong{

_famousDoctorsTong = famousDoctorsTong;

NSLog(@"famousDoctorsTong.title:%@",famousDoctorsTong.title);

self.illTypeLabel.text = [NSString
stringWithFormat:@"疾病类型:%@",famousDoctorsTong.title];

}

好了看似没有什么问题,但是打断点 发现 self.illTypeLabel 这个控件是nil

为什么 调用setter方法的时候还没有加载这个控制器的view,所以子控件也是没有加载的

----解决办法 把赋值的代码方法放到viewDidLoad里面去

- (void)viewDidLoad {

[super
viewDidLoad];

//TODO测试

self.treatedMethodView.hidden =
YES;

[self.illDetailBtn
setBackgroundColor:[UIColor
clearColor]];

[self.complicateBtn
setBackgroundColor:[UIColor
clearColor]];

[self.selectTreatMethodBtn
setBackgroundColor:[UIColor
clearColor]];

self.illTypeLabel.text =[NSString
stringWithFormat:@"疾病类型:%@",self.famousDoctorsTong.title];

}

// 最后来一个总结

  • 懒加载的优点

    • 不需将对象的实例化写到viewDidLoad,可以简化代码,增强代码的可读性
    • 对象的实例化在getter方法中,各司其职,降低耦合性
    • 对系统的内存占用率会减小

viewDidLoad正常加载代码示例

  • 没用懒加载的时候,从plist获取数据,返回一个数组,需要写在viewDidLoad方法中获取
@interface ViewController ()

@property (nonatomic, strong) NSArray *shopData;

@end

@implementation ViewController

- (void)viewDidLoad {

    [super viewDidLoad];

    _shopData = [NSArray arrayWithContentsOfFile:
[[NSBundle mainBundle] pathForResource:@"shop" ofType:@"plist"]];
}

@end
  • 显而易见,当控制器被加载完成后就会加载当前的shopData,假如shopData是在某些事件被触发的时候才会被调用,没必要在控制器加载完就去获取plist文件,如果事件不被触发,代表着shopData永远不会被用到,这样在viewDidLoad中加载shopData就会十分多余,并且耗用内存

懒加载代码示例

- (void)viewDidLoad {

    [super viewDidLoad];
}

- (NSArray *)shopData
{
    if (!_shopData) {
        _shopData = [NSArray arrayWithContentsOfFile:
[[NSBundle mainBundle] pathForResource:@"shop" ofType:@"plist"]];
    }
    return _shopData;
}

@end
  • 当需要用到shopData的时候,就会调用[self shopData]的方法(即getter方法),此时系统会去调用getter方法,然后再getter方法中获取plist文件内容,然后返回使用(需要注意在getter方法里切勿使用self.shopData,因为self.shopData会调用getter方法,造成死循环)

    总结:懒加载即用到时方去加载对象

时间: 2024-10-05 20:40:35

iOS中的懒加载的相关文章

关于swift中的懒加载

懒加载 在 iOS 开发中,懒加载是无处不在的 懒加载的格式如下: lazy var person: Person = { print("懒加载") return Person() }() 懒加载本质上是一个闭包 以上代码可以改写为以下格式 let personFunc = { () -> Person in print("懒加载") return Person() } lazy var demoPerson: Person = self.personFunc

iOS UITableview 图片懒加载demo

1.https://developer.apple.com/library/ios/samplecode/LazyTableImages/Introduction/Intro.html 这是苹果的官方demo,用itunes的应用列表为例,讲述了图片lazy load的思想. 主要思想是,当UITableView处于停止状态时,查找当前视图中的cell,并开始下载icon,下载完成后加载到页面上. 2.可以直接使用第三方加载网络图片的库,SDWebImage,https://github.com

解决hibernate中的懒加载(延迟加载)问题

解决hibernate中的懒加载(延迟加载)问题 我们在开发的时候经常会遇到延迟加载问题,在实体映射时,多对一和多对多中,多的一样的属性默认是lazy="true"(即,默认是延迟加载), 如:<many-to-one name="parent" class="Department" column="parentId" lazy="true"/> 延迟加载表现在:比如:我们要查询id为2的部门数

web中的懒加载

在Web应用程序中,系统的瓶颈常在于系统的响应速度.如果系统响应速度过慢,用户就会出现埋怨情绪,系统的价值也因此会大打折扣.因此,提高系统响应速度,是非常重要的. Web应用程序做的最多就是和后台数据库交互,而查询数据库是种非常耗时的过程.当数据库里记录过多时,查询优化更显得尤为重要.为了解决这种问题,有人提出了缓存的概念.缓存就是将用户频繁使用的数据放在内存中以便快速访问.在用户执行一次查询操作后,查询的记录会放在缓存中.当用户再次查询时,系统会首先从缓存中读取,如果缓存中没有,再查询数据库.

mybatis中的懒加载

知识点:mybatis中的懒加载的使用 参考:https://www.cnblogs.com/ysocean/p/7336945.html?utm_source=debugrun&utm_medium=referral (1)什么是mybatis的懒加载 通俗的讲就是按需加载,我们需要什么的时候再去进行什么操作.而且先从单表查询,需要时再从关联表去关联查询,能大大提高数据库性能, 因为查询单表要比关联查询多张表速度要快. 在mybatis中,resultMap可以实现高级映射(使用associa

iOS设计模式之懒加载

一.为什么要懒加载? 答: iPhone设备内存有限,如果在程序在启动后就一次性加载将来会用到的所有资源,那么久可能会耗尽iOS设备的内存.这些资源例如大量的数据,图片,音频,过多的控件等. 二.懒加载思想是什么? 答: 简单的将就是拖到最后一刻,万不得已了,才加载,才开始占用资源.所谓懒加载,写的就是其getter方法.在开发中,当程序中需要利用的资源时,在程序启动的时候不加载,只有在运行当需要这些资源的时候再去加载这些资源. 三: 懒加载的好处 答: 1.不必将创建对象的代码全部写在view

iOS基础之懒加载

什么是懒加载,即延迟加载,在你需要的时候才加载,也就是说在不需要的时候是不会加载的,减小了占用内存.当然在使用懒加载的时候要注意先加一个判断去判断有无. 为什么要使用懒加载呢?除了上述说的能够减小占用内存,还有就是不必将创建对象的代码全部写在viewDidLoad方法中,代码的可读性更强,每个控件的getter方法中分别负责各自的实例化处理,代码彼此之间的独立性强,松耦合. 代码演示: #import "RootViewController.h" @interface RootView

iOS开发之——懒加载

★懒加载即延时加载,即当对象需要用到的时候再去加载.其实就是重写对象的get方法,当系统或者开发者调用对象的get方法时,再去加载对象. ★注意: 1. 如果是懒加载的话则一定要注意先判断是否已经有了,如果没有那么再去进行实例化            2. 在getter方法里切勿使用self.自己,因为self.自己会调用getter方法,造成死循环 ★使用懒加载的好处: 1. 不必将创建对象的代码全部写在viewDidLoad方法中,代码的可读性更强            2. 每个控件的g

Web程序中的懒加载异常说明及解决方案

所谓懒加载(lazy)就是延时加载,延迟加载. 什么时候用懒加载呢,我只能回答要用懒加载的时候就用懒加载. 至于为什么要用懒加载呢,就是当我们要访问的数据量过大时,明显用缓存不太合适, 因为内存容量有限 ,为了减少并发量,减少系统资源的消耗, 我们让数据在需要的时候才进行加载,这时我们就用到了懒加载.懒加载的异常有很多种,你指的是不是session已经关闭的异常?因为那个初学者最容易遇到情况是当你加载出一个一对多关系的一这端的对象,然后在出了事务之后的地方,比如页面上,还想再获取多端对象里面的除