在 Objective-C 中,指定初始化程序总是被调用的规则并不总是被遵守?

Posted

技术标签:

【中文标题】在 Objective-C 中,指定初始化程序总是被调用的规则并不总是被遵守?【英文标题】:In Objective-C, the rule that designated initializer always get called is not always obeyed? 【发布时间】:2012-09-22 06:16:05 【问题描述】:

我们能否相信在 Objective-C 中,规则是类的指定初始化程序总是被确定调用?或者我们可以说,它应该几乎总是正确的,除了几个例外?例如,对于UIView,docs 表示:

initWithFrame:

如果您以编程方式创建视图对象,则此方法是 UIView 类的指定初始化程序。子类可以覆盖 此方法执行任何自定义初始化,但必须调用 super 在实施之初。

如果您使用界面生成器 设计您的界面,当您的视图时不调用此方法 随后从 nib 文件加载对象。笔尖中的对象 文件被重构,然后使用它们的 initWithCoder 进行初始化: 方法

或者我们可以说,如果是以编程方式,则规则应该始终适用于设计良好的类,但 Interface Builder 有点不同,因为它有点“复活”或以非编程方式构建对象。如果是这样,在我们进行 ios 编程时,它们是不是一般的其他例外情况?

【问题讨论】:

【参考方案1】:

事实上,使用 Interface Builder 设计的类未归档且未初始化。

存档涉及类未初始化而是未存档,因此initWithCoder: 方法负责在使用 Interface Builder 配置的存档属性加载控件时设置控件。

您应该将您的初始化操作放在awakeFromNib: 方法中,该方法在加载对象后在每种情况下都会被调用,这样您就可以确定您的初始化语句将被调用。

【讨论】:

awakeFromNib: 在您以编程方式创建对象时不会被调用。我建议在layoutSubviews 中进行初始设置(对于UIView 子类)

以上是关于在 Objective-C 中,指定初始化程序总是被调用的规则并不总是被遵守?的主要内容,如果未能解决你的问题,请参考以下文章

理解 Objective-C 中的指定构造方法

objective-c中按钮的点击问题……

Objective-C 之字符串与数值

Objective-C 静态、外部、公共变量

Objective-C:所有字符串文字是不是总是加载到内存中?

是否可以在 Objective-C++ 中删除 dispatch_once?