You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UIViewController属性应在viewDidLoad内还是外部初始化?

关于UIViewController属性初始化的困惑解答

嘿,你的困惑其实特别常见,咱们把这个问题拆解开来说清楚:

首先得明确那篇文章里的建议适用场景——它针对的是与视图层级强绑定的UI类属性(比如UIButton、UILabel这类UIKit控件):

这类控件的初始化和配置往往依赖视图的加载状态,比如需要添加到当前view上、设置约束,而在UIViewController实例刚创建时,它的view还没有被加载(viewDidLoad还没触发),此时直接初始化UI控件不仅没有意义,还可能导致布局异常或者不必要的内存占用。所以文章推荐把这类UI属性声明为隐式可选(!)或者可选类型,等到viewDidLoad时再完成初始化和配置,就像第一个例子里的myButton那样。

但你的第二个例子里的属性属于另一类情况,完全不需要遵循这个规则:

  • let defaults = UserDefaults.standard:这是系统提供的单例对象,和视图生命周期完全无关,它是全局可用的存储工具。在初始化时直接赋值不仅没问题,反而更高效,没必要等到view加载后再获取。
  • var itemArray = [Item]():这是一个数据数组,属于业务数据层,和UI没有直接绑定。初始化为空数组有几个好处:
    1. 避免使用可选类型,不用每次使用都做解包操作,代码更简洁安全;
    2. 即使viewDidLoad里没有从UserDefaults加载到数据,tableView也能正常显示空界面,不会因为数组为nil导致崩溃;
    3. 数据类属性不依赖视图层级,提前初始化完全没有副作用。

总结一下判断规则

  • ✅ UI类属性(比如按钮、标签、自定义视图):推荐在viewDidLoad中初始化,声明为可选/隐式可选类型,避免在对象构造时提前初始化;
  • ✅ 数据/工具类属性(比如数组、字典、单例工具、网络管理器):可以直接在声明时初始化,甚至更推荐这么做,能让代码更简洁安全。

回到你的代码,ToDoListVewController里的写法完全可行,不需要把itemArray移到viewDidLoad里声明。这种写法在iOS开发中非常常见,完全符合最佳实践~

内容的提问来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:35:45