懒加载时序问题,懒加载野指针
来源:互联网 发布:ug攻丝编程 编辑:程序博客网 时间:2024/05/23 15:39
在我们使用懒加载的时候,尤其是一个页面有十几个控件的时候。我们调用懒加载经常会出现时序问题。有时候调时序就要耗费几个小时。时序不正确的结果就是系统崩溃,以及野指针的报错。其实都是由于懒加载的写法不规范造成的。下面就通过一个demo总结一下这几种情况。首先看一下我们要实现的效果,如下图:
白色的view是 myview。灰色的是controller的背景
下面我们来看myview中的懒加载 一共4个控件 横线 竖线 数字 总单量。
第一种情况:
横线
-(UIView *)lineView{ if (_lineView == nil) { _lineView = [UIView new]; _lineView.backgroundColor = [UIColor colorWithRed:244/255.0 green:244/255.0 blue:244/255.0 alpha:1/1.0]; } [self addSubview:_lineView]; [_lineView mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(50); make.left.right.equalTo(0); make.height.equalTo(1); }]; return _lineView;}
数字
-(UILabel *)saleAcount{ if(_saleAcount == nil){ _saleAcount = [UILabel new]; _saleAcount.font = [UIFont fontWithName:@"PingFangSC-Medium" size:21]; _saleAcount.textColor = [UIColor colorWithRed:116/255.0 green:95/255.0 blue:110/255.0 alpha:1/1.0]; _saleAcount.textAlignment = NSTextAlignmentCenter; } [self addSubview:_saleAcount]; [_saleAcount mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(self.lineView.mas_bottom).equalTo(17); make.left.equalTo(8); make.height.equalTo(18); make.width.equalTo(150); }]; [self saleAcountTitle]; return _saleAcount;}
总单量及竖线
-(UILabel *)saleAcountTitle{ if(_saleAcountTitle == nil){ _saleAcountTitle = [UILabel new]; _saleAcountTitle.textAlignment = NSTextAlignmentCenter; _saleAcountTitle.text = @"总单量"; _saleAcountTitle.font = [UIFont fontWithName:@"PingFangSC-Regular" size:14]; _saleAcountTitle.textColor = [UIColor colorWithRed:199/255.0 green:202/255.0 blue:217/255.0 alpha:1/1.0]; } [self addSubview:_saleAcountTitle]; [_saleAcountTitle mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(_saleAcount.mas_bottom).equalTo(8); make.left.right.equalTo(_saleAcount); make.height.equalTo(18); }]; UIView *view = [[UIView alloc] init]; view.backgroundColor = [UIColor colorWithRed:215/255.0 green:221/255.0 blue:226/255.0 alpha:1/1.0]; [self addSubview:view]; [view mas_makeConstraints:^(MASConstraintMaker *make) { make.size.equalTo(CGSizeMake(1, 18)); make.top.equalTo(_saleAcountTitle); make.left.equalTo(_saleAcountTitle.mas_right).equalTo(4); }]; return _saleAcountTitle;}
viewcontroller中调用数字这个控件
- (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor grayColor]; myview *vc = [[myview alloc]initWithFrame:CGRectMake(50, 50, 300, 300)]; [self.view addSubview:vc]; vc.backgroundColor = [UIColor whiteColor]; vc.saleAcount.text = @"182246";}
正常显示结果。分析一下。首先调用saleAcount,在masonry约束的时候调用了line。所以Line也出现了。然后返回的时候又调用了数字,所以后两个控件也出来了
注意这是要说第一个问题,我们这种写法,使用saleacont调用saleAcountTitle,所以seleAcountTitle的懒加载中不能使用self.saleAcount去调用saleAcount控件。我们尝试去用self调用一下,看看什么结果。
会提示报错
产生了野指针。因为saleAcount控件还没有生成的时候 你就去调用他的getter方法。而切geteer方法还没走完,又要调用自己。相互等待。可以看到卡了一会就产生了野指针。所以这种写法不好。看似合理的调用。其实当我们写很多的控件以后忘记了调用顺序,很容易产生野指针。所以最好的方法就是约束关系都是用self调用,确保控件已经存在。也就是方法2.
我们来看方法2:
看上图,把saleAcount换成slef.saleAcount就可以自动加载saleAcount这个控件。当我们后面其他控件写约束的时候。与saleAcountTitle相关。我们可以使用slef.saleAcountTitle去出发这个saleAcountTitle的懒加载。当然为了避免野指针我们要删除这行调用
如果只是做这些改动 没有出发这个控件 我们会看到另一个问题。就是莫名其妙的显示不对,如图:
因为我们还没有触发这个控件懒加载。可以另一个控件约束的时候用self触发。也可以viewcontroller中触发:
vc.saleAcountTitle.text = @"总单量";
然后 一切正常
再来看第三个问题,方法3,延续方法2的正常状态。
如果在控件内部懒加载的时候 ,在生成一个控件。这个控件又需要约束懒加载控件的本身。我们要用_saleAcountTitle.因为这个控件还没生成,我们不能用self调用
如果将这两行改成self.
make.top.equalTo(self.saleAcountTitle);make.left.equalTo(self.saleAcountTitle.mas_right).equalTo(4);
同样产生了野指针而崩溃
只要注意以上几种情况,记住约束的时候一定用self调用确保存在。空间没生成的时候,又必须用的时候可以使用 _ 去使用控件。总之就是最好别嵌套调用,像第一种情况。约束的时候都用self就不用考虑懒加载时序问题了
附上github源码供大家调试使用:
https://github.com/lee727n/lazy-loading-sequence
- 懒加载时序问题,懒加载野指针
- 一个关于驱动加载的时序问题
- hibernate懒加载问题
- 懒加载问题
- hibernate懒加载问题
- hibernate懒加载问题
- hibernate懒加载问题
- hibernate懒加载问题
- iOS懒加载问题
- MyBatis懒加载问题
- fragment懒加载问题
- hibernate 懒加载问题
- 图片懒加载(图片延迟加载问题)
- 延迟加载--懒加载
- 懒加载(延迟加载)
- 延时加载 懒加载
- 延时加载|懒加载
- hibernate中的懒加载问题
- Call to a member function format() on string
- Lesson007作业 python
- 在线代码编辑器codeMirror
- 7/4作业:API中异常结构及常见异常
- NSString 中的 Emoji 表情
- 懒加载时序问题,懒加载野指针
- 创建一个maven web项目的种种问题
- IBM HyperLedger fabric 详解
- hackerrank Organizing Containers of Balls
- springboot环境下实现读写分离
- N皇后问题 HDU
- Btrace1.3.9用户手册
- RHEL7 系统ISCSI存储环境搭建
- 嵌入式学习6(C语言运算符及控制语句)