欢迎来到天天文库
浏览记录
ID:15493396
大小:40.00 KB
页数:5页
时间:2018-08-03
《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、类的层次结
此文档下载收益归作者所有