用OC代码懒加载一个UILabel
@interface ViewControlle ()
@property (nonatomic,strong)UILabel *label;
@end
@implementation ViewControlle2r
//懒加载Label
- (UILabel *)label
{
if (_label == nil) {
_label = [[UILabel alloc] init];
}
return _label;
}
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"%@",self.label);
self.label = nil;
NSLog(@"%@",self.label);
}
//打印如下:
<UILabel: 0x7fbf01c068b0; frame = (0 0; 0 0); userInteractionEnabled = NO; layer = <_UILabelLayer: 0x600000090040>>
<UILabel: 0x7fbf04803590; frame = (0 0; 0 0); userInteractionEnabled = NO; layer = <_UILabelLayer: 0x60800008fc30>>
再看用Swift代码懒加载一个UILabel
class ViewController: UIViewController {
private lazy var label: UILabel? = UILabel()
override func viewDidLoad() {
super.viewDidLoad()
print(label)
label = nil
print(label)
}
}
//打印如下:
Optional(<UILabel: 0x7fe2dc60ab90; frame = (0 0; 0 0); userInteractionEnabled = NO; layer = <_UILabelLayer: 0x61000008f7d0>>)
nil
分析:
从OC懒加载的代码就可以看出,如果该控件不存在,就去实例化创建一个,允许控件为nil
,@property (nonatomic,strong)UILabel *label;
只是规定了控件的类型.
但是在Swift的代码中,private lazy var label: UILabel? = UILabel()
,本质上是一个闭包,执行过程也是先到懒加载的闭包里.都到viewDidLoad
中.指定类型的同时分配了空间.(‘?’是手动添加的,不是必须的,为了下面可以设置为nil值),但是当后续使用中一旦赋值了nil
,那么接下来无法继续使用,Swift也不推荐我们这样做.
Swift中懒加载除了能保证控件延迟创建,还有一个作用就是可以避免在开发中处理解包(‘! 和 ?’的使用)的问题.
作者:feng2qing 发表于2017/1/4 21:46:48 原文链接
阅读:51 评论:0 查看评论