应用程序启动过程
-------------
UIApplication的delegate对象
应用程序被打扰 -》进入后台 -》时间长了随时被关闭
UIApplication对象通知delegate来处理一些事情
如:开启和关闭应用程序(应用程序生命周期事件)
来电提醒(系统事件)
内存警告
UIApplicationDelegate 协议
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application;
- (void)applicationDidEnterBackground:(UIApplication *)application;
- (BOOL)application:(UIApplication *)applicationdidFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
id<UIApplicationDelegate> delegate
应用程序创建完成就已经有了 @interface AppDelegate:UIResponse<UIApplicationDelegate>对象并遵守了协议 ApplicationDelegate.h 和.m实现了代理方法
#import <UIKit/UIKit.h>
@interface AppDelegate:UIResponse<UIApplicationDelegate>
@property (strong,nonatomic) UIWindow *window;
@end
文档搜索 apps states 讲解应用程序启动过程和状态 等 要看看
inactive是即将进入active的前台时间很短 background 5秒钟内进入 suspended挂起状态 长时间挂起状态 程序可能被关闭not running
xcode->硬件-》模拟内存警告
NJAppDelegate.m
----------------
ios程序启动过程和UIWindow
1、
int main(int argc, char * argv[])
{
@autoreleasepool {
/*
argc: 系统或者用户传入的参数个数
argv: 系统或者用户传入的实际参数
*/
// return UIApplicationMain(argc, argv, nil, NSStringFromClass([NJAppDelegate class]));
// return UIApplicationMain(argc, argv, @"UIApplication", NSStringFromClass([NJAppDelegate class]));
/* 进入UIApplicatinMain方法的定义里看到说明如下:
1.根据传入的第三个参数创建UIApplication对象
2.根据传入的第四个产生创建UIApplication对象的代理
3.设置刚刚创建出来的代理对象为UIApplication的代理
查看info.plist文件中的main storyboard file name 为 Main ->根据main.storyboard 创年vc.view 和vc -》程序加载完毕
4.开启一个事件循环
监听到程序加载完毕事件
UIApplication对象通知其delegate 执行didFinishLaunchingWithOptions (AppDelegate继承自ViewController)
5、self.window.rootViewController = vc赋值
*/
return UIApplicationMain(argc, argv, @"UIApplication", @"NJAppDelegate"); //UIApplicationMain函数里有一个While循环 所以不会返回 否则程序就结束了
}
}
2、
3、事件放入队列中和入栈相反 UIApplication对象监听事件队列中的事件(包括didFinishLaunchingWithOptions: singleView项目这个方法的部分代码是被苹果隐藏了,实际上是存在的,如果创建的是empty项目就可以知道被隐藏的代码是什么了) 队列是先先进先出
4、UIApplication对象监听到程序加载完毕了 就通知appDelegate执行 didFinishLaunchingWithOptions方法
5、didFinishLaunchingWithOptions代码的系统真实实现步骤:
注:一下代码都在didFinishLaunchingWithOptions里执行,self为UIAppDelegate实例化对象 vc为自定义控制器对象(继承自UIViewController 有view属性对象了)
程 序加载完毕-》 被UIApplication对象监听到了 程序启动完毕事件 ->通知代理(AppDelegate实例)去执行-> didFinishLaunchingWithOptions-》self.window属性上赋值一个UIWindow对象 (self.window = [UIWindow alloc] init];)->
/******添加vc.veiw到self.window上
[self.window addSubview : vc.view] // 这种方法不正确 因为vc在这个方法(didFinishLaunchingWithOptions)里创建,出了这儿方法就被释放了 而不能监听vc.view上的button点击事件等。。
**推荐使用下面的方法
self.window.rootViewController = vc //这行代码执行后 在- (void)setRootViewController:(UIViewController *)vc 方法里
同样执行了 [self.window addSubView:vc.view];
*/
6、self.window makeKeyAndVisible// 让这个window成为主窗口 并显示
程序启动的完整过程
1.main函数
2.UIApplicationMain
* 创建UIApplication对象
* 创建UIApplication的delegate对象
3.delegate对象开始处理(监听)系统事件(没有storyboard)
* 程序启动完毕的时候, 就会调用代理的application:didFinishLaunchingWithOptions:方法
* 在application:didFinishLaunchingWithOptions:中创建UIWindow
* 创建和设置UIWindow的rootViewController
* 显示窗口
3.根据Info.plist获得最主要storyboard的文件名,加载最主要的storyboard(有storyboard)
* 创建UIWindow
* 创建和设置UIWindow的rootViewController
* 显示窗口
UIWindow
UIWindow继承自UIView 但是有一个特别的方法 makeKeyAndVisible (makeKey成为主窗口) 可以让view显示出来
一个app中只有一个UIWindow(一个特殊的UIView)
UIVindow添加控制器view 控制器的view显示到屏幕上了
coca touch->uikit->guideLine ->uiview controller
AppDelegate对象的属性为UIVindow
UIApplication获取window的方法
[UIApplication sharedApplication].keyWindow;
只有ios6里面 主次窗口有区别 ios6里面只有主窗口才能接受到键盘输入事件

浙公网安备 33010602011771号