我最近研究了一些基于 Cocoa 的开源项目。我看到很多程序的初始化代码都在 awakeFromNib 中,很少使用指定的初始化器。我习惯这样做:
- 在被覆盖的指定初始化器中:做所有非 Nib 的东西
- 在 awakeFromNib 中:做所有与 Nib 相关的事情
这种方法是错误的吗?
我最近研究了一些基于 Cocoa 的开源项目。我看到很多程序的初始化代码都在 awakeFromNib 中,很少使用指定的初始化器。我习惯这样做:
这种方法是错误的吗?
是的,没错,所有与 nib 相关的东西都应该在 awakeFromNib 方法中完成。在调用它的那一刻,您已经从 nib 初始化并加载了视图,因此您已经可以配置和使用它。
至于初始化器,请检查这个问题:iOS: UIView subclass init or initWithFrame:?
指定初始化程序是所有其他初始化程序必须调用的初始化程序。UIView 和子类有点不寻常,因为它们实际上有两个这样的初始化程序:-initWithFrame: 和 -initWithCoder:,这取决于视图的创建方式。如果你在代码中实例化视图,你应该覆盖 -initWithFrame:,如果你是从 nib 加载它,你应该覆盖 -initWithCoder:。或者,您可以将代码放在第三种方法中并覆盖这两个初始化程序,以便它们调用您的第三种方法。事实上,这通常是推荐的策略。