initWithNibName与一般init的区别

来源:互联网 发布:c语言 static 编辑:程序博客网 时间:2024/04/29 14:13

init只是加载就行,有没有xib无所谓;

但是initWithNibName需要xib文件,如果该文件不存在则报错:



网上查看了一下,还有和loadNibNamed的区别和联系,暂时我也没用过这个loadNibNamed

内容引用自:http://blog.sina.com.cn/s/blog_7b9d64af01018f2u.html


===================================================

  关于 initWithNibName和 loadNibNamed 的区别和联系。之所以要把这两者来一起讲,我觉的我也有点困惑,到底用那种?其实真正搞清楚了他们之间的差别,就不会这么迷惘了。因为这两个方法,根本就不是一路货色。

 

既然,是要说明这2个方法,那就着重将区别吧。

但是第一步,还是要罗嗦一下,他们的联系可以使用此方法加载用户界面(xib文件)到我们的代码中,这样,可以通过操作这个加载进来的(xib)对象,来操作xib文件内容。

 

下面进入主题,谈区别:

1. ShowViewController的initWithNibName方法

ShowViewController* showMessage = [[ShowViewController alloc]

 

                        initWithNibName:@"ShowViewController" bundle:nil];

 

       self.showViewController = showMessage;

 

       [showMessage release];

 

 

 

2.VideoCellControllerloadNibNamed方法

NSArray * nib = [[NSBundle mainBundle]loadNibNamed:@"Save3ViewController" 

                              owner:self options:nil] ;

self.showViewController= [nib lastObject];

[nib objectAtIndex:0];


 

总结:

只看他们初始化,那可能感觉是一样的。但是如果,打开分别看xib的关系的时候,才恍然大悟,原来他们的集成类都不一样。

1.initWithNibName要加载的xib的类为我们定义的视图控制器类 

  loadNibNamed要加载的xib的类为NSOjbect

(比如:甲,乙都买了一个iPhone,但是,甲的是自己的钱,而乙用的是某某的钱)

 


2.加载方式不同

 initWithNibName方法:是延迟加载,这个View上的控件是 nil 的,只有到 需要显示时,才会不是 nil

loadNibNamed方法:即时加载,用该方法加载的xib对象中的各个元素都已经存在。

(认真理解这句帮规:whenusing loadNibNamed:owner:options:, the File's Owner should be NSObject, themain view should be your class type, and all outlets should be hooked up to theview, not the File's Owner.

 

 

 

这图配上,上变的图,比翻译中文更加清晰。

 

谢谢!希望对您有帮助!

===================================================


下面部分转自:http://blog.csdn.net/yanxiaoqing/article/details/7454281

initWithNibName的初始化问题

在开发过程中,几次碰到在initWithNibName:nibNameOrNil方法里加载组件或者初始化一些值时,都跟没设置一样,查了一些资料才发现,原来initWithNibName:nibNameOrNil得执行顺序是这样子的


supper :self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];if (self) {set   param=@“supper-A”NSLog(@“A-initNIb”);}viewDIdLoad{[super viewDidiLoad];NSLog(@“A-view”);NSLog(param);}sub:self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];if (self) {set   param=@“sub-B”NSLog(@“B-initNIb”);}viewDIdLoad{[super viewDidiLoad];NSLog(@“B-View”);NSLog(param);}


执行sub时输出顺序:

A-initNIb   

A-view

supper-A

B-View

supper-A

B-initNIb


sub-initWithNibName: 里调用supper的initWithNibName:

superclass的initWithNibName方法结束,表示nib文件已加载,则调用sub的 viewDidLoad方法。于是应调用[subclass viewDidLoad]方法。

subclass的viewDidLoad方法又调用了supclass的viewDidLoad方法。

最后才是initWithNibName方法剩余的代码


结论,你在sub里面设置的param=sub-B,并没有起作用输出,因为,在设置之前,sub的view已经执行过了,为了避免这样可以改成

subviewDIdLoad{NSLog(@“B-View”);NSLog(param);[super viewDidiLoad];}- (void)viewDidLoad{[selfsetWords:@” pleaseanswer the door”];[super viewDidLoad];}

原创粉丝点击