--------------xcode4.2以前(用xib)--------------
应用程序开始的时候没有指定和创建delegete,是通过一个xib文件来创建(MainWindow.xib)
int main(int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; int retVal = UIApplicationMain(argc, argv, nil, nil); [pool release]; return retVal; }--程序开始-->创建UIApplication实例-->查看应用程序的 Info.plist -->根据Main nib file base name属性,加载xib文件,创建相应类。程序启动调用相应代理方法,详见如下:
其中File‘s Owner为UIApplication,它的delegate为第三个图标,Button_FunAppDelegate,剩下俩个为Window和初始控制器(delegate类的属性)。通过创建xib,实例化应用程序相应的Delegate类以及Window、控制器。
--应用程序代理类通过xib文件创建,他的相应属性UIWindow、根控制器等也可包括在xib中。
--该xib为《View-based Application》模版,其中有控制器对象。
--《Window-based Application》和《View-based Application》 区别在于有没有第四个图标Button_FunViewController,以及代码 “self.window.rootViewController = self.viewController” 或者“[self.window addSubview: self.viewController.view];”的有无。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. //self.window.rootViewController = self.viewController; [self.window addSubview: self.viewController.view]; [self.window makeKeyAndVisible]; return YES; }
--------------xcode4.2以后(without storyboard)--------------
应用程序开始的时候指定了delegete,之后delegate类被创建。
int main(int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; int retVal = UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); [pool release]; return retVal; }程序开始-->创建UIApplication实例-->创建Delegate类,赋给uiApplication的delegate属性,程序启动后调用相应代理方法。
-- 应用程序Info.plist文件不再需要Main nib file base name属性,也不再需要“MainWindow.xib”。
--应用程序代理类不通过xib文件创建,他的相应属性UIWindow、根控制器类等代码创建。
--模板变为《Empty Application》和《Single View Application》
- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions { self.window= [[UIWindowalloc] initWithFrame:[[UIScreenmainScreen] bounds]]; //self.viewController= [[<app>ViewController alloc] init]; //self.window.rootViewController = self.viewController; [self.windowmakeKeyAndVisible]; return YES; }
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. return YES; }结果:程序启动,屏幕一片漆黑。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. TableViewController *tableViewController = [[TableViewController alloc]initWithStyle:UITableViewStylePlain]; [self.window addSubview:tableViewController.view]; [self.window makeKeyAndVisible]; return YES; }结果:程序启动,屏幕一片漆黑
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. self.window = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]]; TableViewController *tableViewController = [[TableViewController alloc]initWithStyle:UITableViewStylePlain]; [self.window addSubview:tableViewController.view]; [self.window makeKeyAndVisible]; return YES; }结果:程序启动,显示tableviewController的视图,正常。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. NSLog(@"here1"); NSLog(@"%@",self.window); TableViewController *tableViewController = [[TableViewController alloc]initWithStyle:UITableViewStylePlain]; NSLog(@"here2"); [self.window addSubview:tableViewController.view]; NSLog(@"here3"); return YES; }结果:输出,界面显示ViewController的界面
2014-09-20 16:30:22.066 Refer[3253:60b] ViewController : initWithCoder: 2014-09-20 16:30:22.074 Refer[3253:60b] here1 2014-09-20 16:30:22.077 Refer[3253:60b] <UIWindow: 0x14db9020; frame = (0 0; 320 480); hidden = YES; gestureRecognizers = <NSArray: 0x14db9cb0>; layer = <UIWindowLayer: 0x14dbb910>> 2014-09-20 16:30:22.079 Refer[3253:60b] here2 2014-09-20 16:30:22.091 Refer[3253:60b] TableViewController : viewDidLoad 2014-09-20 16:30:22.095 Refer[3253:60b] here3 2014-09-20 16:30:22.104 Refer[3253:60b] ViewController : viewDidLoad分析用例4:tableviewController的界面不显示,可能是被viewController界面覆盖了,还是某种原因。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. NSLog(@"here1"); NSLog(@"%@",self.window); NSLog(@"%@",self.window.rootViewController); TableViewController *tableViewController = [[TableViewController alloc]initWithStyle:UITableViewStylePlain]; NSLog(@"here2"); [self.window setRootViewController:tableViewController]; // or [self.window.rootViewController.view addSubview:tableViewController.view]; NSLog(@"here3"); return YES; }结果:输出,界面显示tableviewController的界面
2014-09-20 16:40:14.135 Refer[3260:60b] ViewController : initWithCoder: 2014-09-20 16:40:14.143 Refer[3260:60b] here1 2014-09-20 16:40:14.146 Refer[3260:60b] <UIWindow: 0x16e5f570; frame = (0 0; 320 480); hidden = YES; gestureRecognizers = <NSArray: 0x16e5fc10>; layer = <UIWindowLayer: 0x16e5f650>> 2014-09-20 16:40:14.148 Refer[3260:60b] <ViewController: 0x16da9be0> 2014-09-20 16:40:14.150 Refer[3260:60b] here2 2014-09-20 16:40:14.153 Refer[3260:60b] here3 2014-09-20 16:40:14.167 Refer[3260:60b] TableViewController : viewDidLoad结果(当执行or里面的语句)输出,界面显示tableviewController的界面
014-09-20 16:43:21.707 Refer[3268:60b] ViewController : initWithCoder: 2014-09-20 16:43:21.716 Refer[3268:60b] here1 2014-09-20 16:43:21.718 Refer[3268:60b] <UIWindow: 0x16d88720; frame = (0 0; 320 480); hidden = YES; gestureRecognizers = <NSArray: 0x16e7a1b0>; layer = <UIWindowLayer: 0x16d8c2b0>> 2014-09-20 16:43:21.720 Refer[3268:60b] <ViewController: 0x16d8a170> 2014-09-20 16:43:21.722 Refer[3268:60b] here2 2014-09-20 16:43:21.731 Refer[3268:60b] ViewController : viewDidLoad // <span style="color:#cc0000;">因为调用到了它</span> 2014-09-20 16:43:21.741 Refer[3268:60b] TableViewController : viewDidLoad 2014-09-20 16:43:21.743 Refer[3268:60b] here3分析用例5: 当info.plist里面有值时,程序先加载storyboard中的对象,并创建之,之后创建AppDelegate的window,并且将初始控制器赋值给window的rootViewController,然后调用application:didFinishLaunchingWithOptions方法。