1.每一个应用程序都 有属于自己的UIWindow, UIWidow继承自UIView.
2.UIView面临的问题
1> 谁来控制UIView之间的切换?
2>谁来管理UIView的生命周期?
3>谁来给UIView装配数据?
4>谁来监听UIView的事件?
上面总是的答案是:控制器(UIViewController)
ios程序的运行原理:
1.首先执行main函数
2.执行UIApplicationMain函数
3.UIApplicationMain函数内部
1》创建一个UIApplication对象 是单粒的,一个iOS程序对应一个UIApplication对象
2> UIApplication对象是应用程序的象征
3》开启一个消息循环(main loop),用来监听用户的操作
4》再创建一个UIApplication的delegate对象,负责监听UIApplication的生命周期
5》当UIApplication的生命周期发生改变时,会给delegate发送不同的消息
*当第一次运行程序的时候:
didFinishLaunchingWithOptions (加载完毕)-》
applicationDidBecomeActive (获取焦点)
*当点击home键的时候:applicationWillResignActive (失去焦点)—>
applicationDidEnterBackground (进入后台)
*当再次点击应用图标重新进入应用的时候:applicationWillEnterForeground (进入前台)-》
applicationDidBecomeActive (获取焦点)
UIApplicationMain函数的的参数
//
// main.m
// 第一个IOS程序
//
// Created by apple on 14-6-12.
// Copyright (c) 2014年 itcast. All rights reserved.
//
#import <UIKit/UIKit.h>
#import "WFAppDelegate.h"
int main(int argc, char * argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([WFAppDelegate class]));
}
}
第3个用来指定UIApplication的类名(或者子类),如果是nil相当于
NSStringFromClass([UIApplication class])
第4个参数用来指定uIApplication的代理
应用程序加载后,初始化控制器
#pragma mark 在应用程序加载完毕之后调用
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSLog(@"didFinishLaunchingWithOptions-加载完毕");
// 初始化一个窗口
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
// 传入xib文件名来初始化一个控制器
self.viewController = [[[MJViewController alloc] initWithNibName:@"MJViewController" bundle:nil] autorelease];
// 设置窗口的根控制器
self.window.rootViewController = self.viewController;
// 上面的代码内部执行了下面代码的操作
// [self.window addSubview:self.viewController.view];
// 窗口不会默认显示,需要调用方法来显示
// keyWindow是主窗口,只有主窗口才能跟用户正常交互
[self.window makeKeyAndVisible];
// self.window.hidden = NO;
return YES;
}