在 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 中,指定初始化程序总是被调用的规则并不总是被遵守?的主要内容,如果未能解决你的问题,请参考以下文章