- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
initWithNibName导致的初始化问题
?众所周知,IB在加载nib的过程中存在着一些undocument行为,有的行为确实是不可理喻的,因此程序员对IB产生了抗拒心理。
今天我们要介绍的是IB导致的一个奇特行为。通过本文的描述, 作者完美地展示了IB给面向对象所带来的破坏作用。
我们有两个View Controller,暂名为superclass和subclass。subclass继承了superclass。在superclass的initWithNibName初始化方法中,我们这样写道:
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
[self setWords:@”somebody is knocking”];
}
return self;
?
在superclass的viewDidLoad方法中,我们这样写:
[super viewDidLoad];
NSLog(@get XXX:%@, [self words]);
然后我们用subclass继承superclass。在initWithNibName方法中,我们写入:
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {[
[self setWords:@” pleaseanswer the door”];
}
?
很显然,我们通过覆盖initWithNibName方法,修改了从superclass继承来的words属性。如果我们想打印pleaseanswer the door这段文本,你可能会想重用superclass的viewDidLoad方法:
- (void)viewDidLoad{
[super viewDidLoad];
}
?
好了,运行程序。在加载superclass.xib时,控制台将打印somebodyis knocking。而加载subclass.xib时,控制台会打印please answer the door。
Hey,等一等。为什么我会在两个ViewController中都看到了somebody is knocking?
不用看了,subclass对象的words属性确实是pleaseanswer the door。如果你正在调试代码,那么可以debug区中确认这一点。
问题在于subclass的初始化出现了问题。看这一句:self=[superinitWithNibName:nibNameOrNil bundle:nibBundleOrNil];
这句代码将导致IB加载nib文件,并立即调用viewDidLoad方法。我们可以看到在初始化subclass时的调用顺序如下:
1. subclass-initWithNibName
2. superclass-initWithNibName
3. superclass-setWords
4. subclass-viewDidLoad
5. superclass-initWithNibName
6. subclass-setProperty
让我再解释一下:
1. 首先subclass的initWithNIbName方法调用。
2. 接着调用superclass的initWithNibName方法。
3. 在superclass的initWithNibName方法中,words属性被设置为somebodyis knoking。
4. superclass的initWithNibName方法结束,表示nib文件已加载,则调用nib文件的File’sowner所指向的 viewDidLoad方法。注意,这时的nib文件名应为subclass.nib,于是应调用[subclass viewDidLoad]方法。
5. subclass的viewDidLoad方法又调用了supclass的viewDidLoad方法。于是控制台打印出的是words属性的当前值somebodyis knoking。
6. 最后才是initWithNibName方法剩余的代码,在这里我们将words属性修改为pleaseanswer the door。但为时已晚,在此之前viewDidLoad已经执行结束。
解决的办法是简单的,不要在initWithName方法中修改从父类继承来的属性,相反,我们可以在[super iewDidLoad]之前这样做:
- (void)viewDidLoad{
[selfsetWords:@” pleasea
您可能关注的文档
最近下载
- 浙江省2025年普通高校招生体育类第一段平行投档分数线.xls VIP
- docker面试常见问题.docx VIP
- 黑龙江中医药大学《马克思主义基本原理》2020-2021学年第一学期期末试卷.pdf VIP
- 具身智能的基础知识(68页).pptx VIP
- SMT贴片机基础培训 (西门子).pptx VIP
- 游戏资料:哥特王朝救世军完全任务攻略.docx VIP
- 生理学之消化和吸收.ppt VIP
- 二年级上册科学教案-1.2.土壤——动植物的乐园-教科版(2017).doc VIP
- 专题03有理数的运算8大题型(期中真题汇编,湖北专用)七年级数学上学期人教版2024【附答案】.pdf
- 第七章 软饮料工艺ppt课件.ppt VIP
原创力文档


文档评论(0)