知识卡片

延时存储属性的懒加载权衡

专业/工作 · 633.a

内容

被声明为延时的[[存储属性与计算属性的区别|存储属性]]在实例构造阶段不会被初始化,只有第一次被真正访问时才会执行构造 逻辑并把结果缓存下来。对于那些构造代价高(如需要读文件、做复杂计算)又不一定每次都会 被用到的属性,这样可以把开销从”实例创建时必然发生”推迟到”真正需要时才发生”,从而加快 实例构造速度、节省不必要的资源消耗。代价是它不是线程安全的——多个线程同时首次访问同一个 延时属性,无法保证只被构造一次。发散:这是”提前计算换取访问时零延迟”与”延后计算换取 构造时零开销”之间的经典取舍,选择哪种取决于这个属性被访问的概率和构造成本哪个更值得 优化。

参考来源

《Swift 4从零到精通iOS开发》第8章《属性与方法》