王尘宇王尘宇

研究百度干SEO做推广变成一个被互联网搞的人

iOS 更懒的懒加载

iOS 更懒的懒加载

代码块里面无法使用数组

LazyLoad 2.0

直到我看到 FDTemplateLayoutCell 的源码,看到 FDIndexPathHeightCache 里面有这么一个宏 FDPrimaryCall(...)

好奇心使我尝试了一下,神奇的发现它竟然可以在代码块里面写数组,于是研究了下,终于可以愉快的让所有懒加载都用上这个方便的宏了,实在是太感动了,感谢 Sunny 大神啊 ?

先来看看对比效果

iOS 更懒的懒加载

对比

我承认我夸大了,实际的代码中肯定会有大量的换行,两边的实际代码量,不会有这样两倍的差距。

阿勒,被你们发现了,改进的宏不止加入了数组字典的支持,还加入了一个简短的临时变量 z, 可以让代码更简洁。不过按个人喜好,想用下划线变量也是可以的。

LazyLoad 最终版 !!!

#define GGLazyLoad(TypeNoPoint, Name, Code...) \
- (TypeNoPoint *)Name { \
    if (!_##Name) { \
        TypeNoPoint *z = nil; \
        Code; \
        _##Name = z; \
    }\
    return _##Name; \
}

#define GGLazyLoadNew(TypeNoPoint, Name, Code...) \
- (TypeNoPoint *)Name { \
    if (!_##Name) { \
        TypeNoPoint *z = [TypeNoPoint new]; \
        Code; \
        _##Name = z; \
    }\
    return _##Name; \
}

当然了,这个宏定义并不是完美的,它有些无法解决问题

  1. 代码块里面的代码,着色不够完美
  2. show document items(ctrl+6)这个列表里面,无法显示懒加载方法
  3. 还有无法断点调试

iOS 更懒的懒加载

编辑器的问题

还有的问题,比如宏用多了影响编译速度啊,我觉得不太大,文件编译后都会有缓存。

最后,都 2020 年了,还在这里折腾 OC 是不是太落后了 ? 。

// Swift 
lazy var nameLabel: UILabel = {
    let z = UILabel.init()
    return z
}()

相关文章

评论列表

发表评论:
验证码

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。