UIScreen(屏幕)、UIWindow(画框)、UIView(画布)、didFinishLaunchingWithOptions、UIViewController各个方法的加载顺序

来源:互联网 发布:2018程序员考试时间 编辑:程序博客网 时间:2024/05/02 02:25

m

http://blog.csdn.net/heng615975867/article/details/39053695


//didFinishLaunchingWithOptions 方法:顾名思义。在app开始运行时会调用里面的方法。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    //返回的是带有状态栏的矩形
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
   
    CGRect bound = [[UIScreen mainScreen]bounds];  //返回的是带有状态栏的Rect
    NSLog(@"boundwith:%f    boundheight:%f",bound.size.width,bound.size.height); 
    NSLog(@"boundx:%f    boundy:%f",bound.origin.x,bound.origin.y); 
    //2012-08-03 23:21:45.716 DinkMixer[599:c07] boundwith:320.000000    boundheight:480.000000
    //2012-08-03 23:21:45.719 DinkMixer[599:c07] boundx:0.000000    boundy:0.000000


    CGRect appBound = [[UIScreen mainScreen]applicationFrame];  //返回的是不带有状态栏的Rect
    NSLog(@"appBoundwith:%f    boundheight:%f",appBound.size.width,appBound.size.height); 
    NSLog(@"appBoundx:%f    boundy:%f",appBound.origin.x,appBound.origin.y);
    //2012-08-03 23:21:45.720 DinkMixer[599:c07] appBoundwith:320.000000    boundheight:460.000000
    //2012-08-03 23:21:45.720 DinkMixer[599:c07] appBoundx:0.000000    boundy:20.000000


    //很明显状态栏占用了空间20像素
  
    MasterViewController *masterViewController = [[[MasterViewController alloc] initWithNibName:@"MasterViewController" bundle:nil] autorelease];
//根据nib文件的名称来创建一个视图控制器

    self.navigationController = [[[UINavigationController alloc] initWithRootViewController:masterViewController] autorelease];
//创建一个导航控制器,并指定该导航控制器的根视图控制器为上面建立的masterViewController

    self.window.rootViewController = self.navigationController;//
窗体(window)有一个根视图控制器——这个视图控制器负责配置当窗体显示时最先显示的视图。要让你的视图控制器的内容显示在窗体中,需要去设置窗体的根视图控制器为你的视图控制器。
   
   
 [self.window makeKeyAndVisible];//这行代码会让包含了视图控制器视图的Window窗口显示在屏幕上。
    return YES;
}

 加载过程
加载第一步
     - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
     //根据nib文件实例化UIViewController
   // 这个方法是在controller的类在IB中创建,但是通过Xcode实例化controller的时候用的.

//如果你的对象是UIViewControler的子类,那么你必须调用- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle*)nibBundleOrNil;方法去调用NIB文件初始化自身,即使那没有使用nib文件也会调用这个函数(默认 情况下init方法已经为你的做这件事情了),如果你调用这个方法,并传递的两个参数为空(nil),然后类会调用-loadView去读取一个名字和你 的UIViewController名字相同的nib文件,来初始化自身。如果没有这样的nib文件,你必须调用-setView:来设置一个 self.view。或者重载-loadView 方法

 加载第二步
    - (void)loadView 

   当view需要被展示而它却是nil时,viewController会调用该方法。不要直接调用该方法。

   如果手工维护views,必须重载重写该方法

   如果使用IB维护views,必须不能重载重写该方法

   loadView和IB构建view

   作用:在需要用程序自定义view时重新,其他情况可以不用考虑



 加载第三步
    - (void)viewDidLoad
   //如果loadView不能生成UIViewController.view系统将会反复调用loadView及viewDidLoad方法, 并且最终调用[super loadView] 方法返回UIViewController.view

//重载重写该方法以进一步定制view

//在iPhone OS 3.0及之后的版本中,还应该重载重写viewDidUnload来释放对view的任何索引

//viewDidLoad后调用数据Model

//在视图加载后被调用,如果是在代码中创建的视图加载器,他将会在loadView方法后被调用,

//如果是从nib视图页面输出,他将会在视图设置好后后被调用。


作用:分配和载入在视图显示时所需要的数据

一般情况下,数据对象是通过配置view controller的属性来提供的,view controller需要的一些额外的数据应该通过重写viewDidLoad函数来提供。



 加载第四步

   - (void)viewWillAppear:(BOOL)animated;

  //视图即将可见时调用。默认情况下不执行任何操作

 加载第五步

   - (void)viewDidAppear:(BOOL)animated;

 //视图已完全过渡到屏幕上时调用

另外如果你这样写:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{

self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];

if (self) {

UIView *view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];

self.view = view;

[view release];

// Custom initialization

NSLog(@”initWithNibName”);

}

return self;

}

那么loadView和viewDidLoad 方法将不会被调用

  - (void)viewWillLayoutSubviews ;

  - (void)viewDidLayoutSubviews;


卸载过程

卸载第一步

- (void)viewWillDisappear:(BOOL)animated;

//意思是在视图将要释放前调用该函数

卸载第二步

- (void)viewDidDisappear:(BOOL)animated;

//viewDidDisappear意思是在视图释放时调用。

卸载第三步

- (void)viewWillUnload;//iOS5.0添加

作用:释放显示视图时所需要的不难重建的数据

卸载第四步

- (void)viewDidUnload;

//当系统内存吃紧的时候会调用该方法(注:viewController没有被dealloc)

//当视图不再显示时释放那些不需要的数据。

作用:释放视图对象的引用和显示视图时所需要的不难重建的数据

//可以使用viewDidUnload函数释放视图拥有的所有数据,当然这些数据在视图重新载入内存时能够很容易重新//创建。
//如果重建这些数据很消耗时间,那么不必在viewDidUnload函数中释放这些数据,可以考虑在//didReceiveMemoryWarning函数释放这些数据对象

卸载第五步

- (void)didReceiveMemoryWarning;

//释放在viewDidUnload函数中没有释放的数据(重建耗时的数据)

卸载第六步

- (void)dealloc;

//viewController最后的清理工作,释放视图对象的引用和viewController所需数据结构



PS: 当程序收到内存不足的警告后, 程序内存中的所有的UIViewController都将会收到didReceiveMemoryWarning调用消息. 目的是将当前不显示的UIViewController中的view释放掉(不会调用UIViewController的dealloc方法), 所以当该UIViewController再次显示的时候又要生成一次, 此时它会调用loadView-> viewDidLoad ->viewWillAppear等, 这时最容易造成内存泄漏!

- (void)didReceiveMemoryWarning;

- (void)viewWillUnload;//iOS5.0添加

- (void)viewDidUnload;



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 加热圈功率小加不到设定温度怎么办 本田飞度05年车尾气不好怎么办 文件在lr中打开后找不到了怎么办 手机安装软件成功屏幕上没有怎么办 脸过敏发红痒怎么办用什么药膏 脸上又红又肿又痒怎么办 宝宝把皮革咬烂吃掉了怎么办 自动档皮革挡把防尘套烂了怎么办 pu包用酒精擦坏了怎么办 白色的面料被84弄黄了怎么办 要账的人赖在家不走怎么办 两塔吊的安全距离不够2米怎么办 腿上被蚊子咬后留下的黑疤怎么办 携程订的酒店酒店一直没确认怎么办 客斤的无窗挨着厨房怎么办 餐桌和墙紧挨着容易脏怎么办 vivo手机被设置成英文该怎么办 电脑开机后显示英文字该怎么办? 看到文言文就不会翻译该怎么办呢 房间楼层太高闷热不通风怎么办 对方全责不理赔没有财产怎么办啊 买二手房过户后发现房顶漏水怎么办 钻石绣的钻两个粘在一起怎么办 开修理部的一天不干活都着急怎么办 调好的车漆时间长了有点稠怎么办 下滤鱼缸下水管声音大怎么办 家里水管不开水龙头就总是响怎么办 生完儿子后腹股沟特黑怎么办 因盗窃罪出狱数额较大还不起怎么办 司法拍卖房原房主拒绝搬离怎么办 wps卡了没反应没有保存怎么办 微信扫描支付环境有风险怎么办 手机安装东西突然要扫描很久怎么办 我惹朋友真的很生气了怎么办 买了保险后又犯杀人罪 保险怎么办 水瓶盖了拧歪了打不开怎么办 刚买的老干妈盖子打不开怎么办? 门冬胰岛素的盖子转不动怎么办 diy做的蝴蝶结上的歪了怎么办 电脑显示电源已接通未充电怎么办 微博账号被锁无法登录怎么办