initwithnibname导致的初始化问题

initwithnibname导致的初始化问题

ID:15493396

大小:40.00 KB

页数:5页

时间:2018-08-03

initwithnibname导致的初始化问题_第1页
initwithnibname导致的初始化问题_第2页
initwithnibname导致的初始化问题_第3页
initwithnibname导致的初始化问题_第4页
initwithnibname导致的初始化问题_第5页
资源描述:

《initwithnibname导致的初始化问题》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、initWithNibName导致的初始化问题 众所周知,IB在加载nib的过程中存在着一些undocument行为,有的行为确实是不可理喻的,因此程序员对IB产生了抗拒心理。今天我们要介绍的是IB导致的一个奇特行为。通过本文的描述,作者完美地展示了IB给面向对象所带来的破坏作用。我们有两个ViewController,暂名为superclass和subclass。subclass继承了superclass。在superclass的initWithNibName初始化方法中,我们这样写道:self=[superinitWithNibName:nibNameOrNi

2、lbundle:nibBundleOrNil];if(self){[selfsetWords:@”somebodyisknocking”];}returnself; 在superclass的viewDidLoad方法中,我们这样写:[superviewDidLoad];NSLog(@"getXXX:%@",[selfwords]);然后我们用subclass继承superclass。在initWithNibName方法中,我们写入:self=[superinitWithNibName:nibNameOrNilbundle:nibBundleOrNil];if(se

3、lf){[[selfsetWords:@”pleaseanswerthedoor”];} 很显然,我们通过覆盖initWithNibName方法,修改了从superclass继承来的words属性。如果我们想打印pleaseanswerthedoor这段文本,你可能会想重用superclass的viewDidLoad方法:-(void)viewDidLoad{[superviewDidLoad];} 好了,运行程序。在加载superclass.xib时,控制台将打印somebodyisknocking。而加载subclass.xib时,控制台会打印pleasean

4、swerthedoor。Hey,等一等。为什么我会在两个ViewController中都看到了somebodyisknocking?不用看了,subclass对象的words属性确实是pleaseanswerthedoor。如果你正在调试代码,那么可以debug区中确认这一点。问题在于subclass的初始化出现了问题。看这一句:self=[superinitWithNibName:nibNameOrNilbundle:nibBundleOrNil];这句代码将导致IB加载nib文件,并立即调用viewDidLoad方法。我们可以看到在初始化subclass时的调

5、用顺序如下:1.subclass->initWithNibName2.superclass->initWithNibName3.superclass->setWords4.subclass->viewDidLoad5.superclass->initWithNibName6.subclass->setProperty让我再解释一下:1.首先subclass的initWithNIbName方法调用。2.接着调用superclass的initWithNibName方法。3.在superclass的initWithNibName方法中,words属性被设置为somebo

6、dyisknoking。4.superclass的initWithNibName方法结束,表示nib文件已加载,则调用nib文件的File’sowner所指向的viewDidLoad方法。注意,这时的nib文件名应为subclass.nib,于是应调用[subclassviewDidLoad]方法。5.subclass的viewDidLoad方法又调用了supclass的viewDidLoad方法。于是控制台打印出的是words属性的当前值somebodyisknoking。6.最后才是initWithNibName方法剩余的代码,在这里我们将words属性修改为

7、pleaseanswerthedoor。但为时已晚,在此之前viewDidLoad已经执行结束。解决的办法是简单的,不要在initWithName方法中修改从父类继承来的属性,相反,我们可以在[superiewDidLoad]之前这样做:-(void)viewDidLoad{[selfsetWords:@”pleaseanswerthedoor”];[superviewDidLoad];} 结论由于initWithNibName或者是IB这些限制,.nib文件违反了面向对象的原则。.nib文件无法从另一个.nib文件继承。不管你的类如何继承,但nib文件中不会保存

8、类的层次结

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。