loadView的使用总结

一、loadView 

1. loadView什么时候被调用?

          每次访问UIViewController的view(如 controller.view、self.view)并且view为nil,loadView方法就会被调用

2. 有什么作用

   loadView 方法是用来负责创建UIViewController的view

3. 默认实现是怎样的?

    默认实现即[super loadView]里面做了好多事情:

               1> 它会先去查找与UIViewController相关联的xib文件,通过加载xib文件来创建UIViewController的view

                   *  如果在初始化UIViewController指定了xib文件名,就会根据传入的xib文件名加载对应的xib文件

                      [[MJViewController alloc] initWithNibName:@"MJViewController" bundle:nil];

                   *  如果没有明显地传xib文件名,就会加载跟UIViewController同名的xib文件

                      [[MJViewController alloc] init]; // 加载MJViewController.xib

               2> 如果没有找到相关联的xib文件,就会创建一个空白的UIView,然后赋值给UIViewController的view属性,大致如下

                    self.view = [[[UIView alloc] initWithFrame:

                    [UIScreen mainScreen].applicationFrame] autorelease];

         // applicationFrame的值是:{{x = 0, y = 20}, {width = 320, height = 460}}

                    [super loadView]里面就大致完成1>和2>中叙述的内容

4.如何正确使用这个方法?

    UIViewController 可以通过xib文件来创建,但在某些情况下,xib不是那么灵活,所有我们有些时候想通过代码来创建UIView     

比如: self.view = [[[UIWebView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame] autorelease];

                      如果想通过代码来创建UIViewController的view,就要重写loadView方法,并且不需要调用[super loadView],第三点已经提到若没有xib文件,

                      [super loadView]默认创建一个空白的UIView。我们既然要通过代码来自定义UIVIew,那么就没必要事先创建一个空白的UIView,以节省不必要的开销,正确的做法应该是这样的:

                           - (void)loadView {

          self.view = [[[UIWebView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame] autorelease];

         }

        不需要调用[super loadView],即使调用了也不会出错,只是造成了一些不必要的开销。总而言之,苹果设计这个方法是给我们自定义UIViewController的view用的

二、viewDidLoad

1. 什么时候被调用?

  无论是通过xib文件还是重写loadView 方法创建的UIViewController的view,在view创建完毕后,最终都会调用viewDidLoad方法的。

 2. 有什么作用?

    一般会在这里做界面上的初始化的操作,比如往view中添加一些子视图、从数据库或者网络加载模型数据装配到子视图中。

             例如:

           - (void)viewDidLoad {

               [super viewDidLoad];

               //添加一个按钮

               UIButton *button = [UIButton buttonWithType:UIButtonTypeContactAdd];

               [button addTarget:self action:@selector(click) forControlEvents:UIControlEventTouchUpInside];

               [self.view addSubview:button];

           }

三、viewDidUnload

1.什么时候被调用?

       iOS设备的内存是极其有限的,如果应用程序占用的内存过多的话,系统就会对应用程序发出内存警告。UIViewController就会收到didReceiveMemoryWarning消息。  didReceiveMemoryWarning方法的默认实现是:如果当前UIViewController的view不在应用程序的视图层次结构(View Hierarchy)中,即view的superview为nil的时候,就会将view释放,并且调用viewDidUnload方法

2.有什么作用?

  上面说到,发出内存警告且view被释放的时候就会调用viewDidUnload方法,所以一般在释放资源,主要是释放界面元素相关的资源,将相关的实例都赋值为nil

     - (void)viewDidUnload {

         [super viewDidUnload];

         self.name = nil;

         self.pwd = nil;

     }

3.dealloc也是用来释放资源的,那跟viewDidUnload有什么关系?

    当发出内存警告调用viewDidUnload方法时,只是释放了view,并没有释放UIViewController,所以并不会调用dealloc方法。即viewDidUnload和dealloc方法并没有任何关系,dealloc方法只会在UIViewController被释放的时候调用

四、三个方法的关系

    1.    第一次访问UIViewController的view时,view为nil,然后  机会调用loadview方法来创建view

    2.   view创建完毕后调用viewDidLoad方法进行界面元素的初始化

  3.   当内存警告时,系统可能会释放UIViewController,将view赋值为nil,并且调用viewDidUnload方法

  4.  当再次访问UIViewController的view时,view已经在3中被赋值为nil,所以又要调用loadview方法重新创建view

  5.  view被重新创建完毕后,还会调用viewDidLoad 方法进行元素的初始化                    

时间: 2024-10-20 12:21:33

loadView的使用总结的相关文章

loadView、viewDidLoad及viewDidUnload的关系

一.loadView 1.什么时候被调用? 每次访问UIViewController的view(比如controller.view.self.view)而且view为nil,loadView方法就会被调用. 2.有什么作用? loadView方法是用来负责创建UIViewController的view 3.默认实现是怎样的? 默认实现即[super loadView]里面做了什么事情. 1> 它会先去查找与UIViewController相关联的xib文件,通过加载xib文件来创建UIViewC

loadView 再思考

如果使用代码创建view,那么就需要重写loadView方法: 在这个方法中,如果不创建view,就会循环的调用loadView. - (void)loadView { UIView *view = [[UIViewalloc]initWithFrame:[[UIScreenmainScreen]applicationFrame]]; self.view = view; UIButton *button = [UIButtonbuttonWithType:UIButtonTypeRoundedR

loadView中的那些事!!!!

对loadView的方法还存有疑问,于是找到以下这篇文章 mark一下,希望对loadView方法的理解有进一步的帮助 UIViewController类或其子类会在初始化时创建一个UIView对象,会作为控制器的默认视图显示出来,可以通过self.view寻址访 问.但没有调用loadView方法时,self.view=nil.默认loadView方法(即[super  loadView])的作用是产生一个空白的view. 我们有两种方法把textView加入到self.view中, [sel

viewDidLoad、loadView

一.loadView永远不要主动调用这个函数.view controller会在view的property被请求并且当前view值为nil时调用这个函数.如果你手动创建view,你应该重载这个函数,且不要在重载的时候调用[super loadview].如果你用IB创建view并初始化view controller,那就意味着你使用initWithNibName:bundle:方法,这时,你不应该重载loadView函数.这个方法系统的默认实现是这样:1.寻找有关可用的nib文件的信息,根据这个

关于在 loadView 中改变状态栏的可视性

这种问题不知道大家是否遇见过,在此用两句话(时间紧迫,还得加班)分享下今天犯的错误 我把状态栏的的可视性的改变写在了loadView 里面,然后就出现了调用了两次 loadView 和 viewDidLoad 方法,很是郁闷,找了好长时间的 bug 最后通过在网上查资料了才发现错误原因: 因为改变可视性会改变view 的长度,所以 loadView 会创建两个 view, 即loadView 和 viewDidLoad 两次,但是影响下不是太大,就是怕造成以后的位置错误 1 - (void)lo

视图加载过程中会触发的方法(loadView/viewDidLoad/didReceiveMemoryWarning)

1.loadView 这是视图控制器用来加载根视图的方法; 如果需要将自定义的视图作为根视图,则不需要调用父类对该方法的实现([super loadView]);直接将自定义视图通过self.view定义为视图控制器的根视图; 自定义视图中的简单响应事件也应由视图控制器来进行处理,写在此方法内; 2.viewDIdLoad 当视图控制器的根视图加载完成之后触发该方法;(也就是loadView调用完成之后会立即调用该方法); 需要调用父类对该方法的实现; 该方法可以对根视图进行简单的一些设置,比如

loadView、viewDidLoad及viewDidUnload的关系(转)

原文:http://blog.csdn.net/q199109106q/article/details/8614044/ 标题中所说的3个方法,都是UIViewController的方法,跟UIViewController的view属性的生命周期息息相关.接下来我会一一阐述它们的作用以及它们之间的联系. loadView(VC的view是懒加载) 1.什么时候被调用? 每次访问UIViewController的view(比如controller.view.self.view)而且view为nil

ViewController里的loadView和viewDidLoad什么区别

当你访问一个ViewController的view属性时,如果此时view的值是nil,那么,ViewController就会自动调用loadView这个方法.这个方法就会加载或者创建一个view对象,赋值给view属性.loadView默认做的事情是:如果此ViewController存在一个对应的nib文件,那么就加载这个nib.否则,就创建一个UIView对象.如果你用Interface Builder来创建界面,那么不应该重载这个方法.如果你想自己创建view对象,那么可以重载这个方法.

CI load->view();的一个小坑。。。

CI load->view()  很智能,如果加载多个视图  他会全部读完再按顺序载入所有视图 但这里有一个小坑,底层会遍历你的函数,看有多少视图 再决定当前的视图是否为最后一个, 如果你的代码中有die exit这个的语句, 这个遍历就会被近中止, 所有的视图就都不会执行 切记 切记.. 如果想要中断这种机制,  直接执行视图,不执行下面的语句, : 加上$this->output->_display();就好了 但是这样就会失去灵活性. 谨慎用.