Quantcast
Channel: CSDN博客移动开发推荐文章
Viewing all articles
Browse latest Browse all 5930

对比分析Objective_C和Swift懒加载的区别

$
0
0

用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 查看评论

Viewing all articles
Browse latest Browse all 5930

Trending Articles