热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

iOS:App启动过程详解(不同方式)

--------------xcode4.2以前(用xib)--------------xib创建应用程序开始的时候没有指定和创建delegete,是通过一个xib文件来创建(MainWi

--------------xcode4.2以前(用xib)--------------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= [[ViewController alloc] init];
        //self.window.rootViewCOntroller= self.viewController;
	[self.windowmakeKeyAndVisible];
 return YES;
}
------- ------- xcode4.2以后(with storyboard) ------- -------storyboard创建

--注:上图是without storyboarding的方式,借鉴
--.先执行main函数,main内部会调用UIApplicationMain函数
--.UIApplicationMain函数里面做了什么事情:
1.调用UIApplicationMain()函数;
2.创建UIApplication对象;
3.创建UIApplication的delegate对象-----XXAppDelegate;
4.加载Info.plist文件,读取最主要storyboard文件的名称;
5.UIApplication开启一个消息循环
* 每监听到对应的系统事件时,就会通知MJAppDelegate;
6.UIApplication调用相关代理方法;
------------我是分割线------------
那么在6之前UIApplication调用相关代理方法之前,4里面创建storyboard里面做了哪些事情?
------ ------end ------------
      ** 用例1**:不使用storyboard,程序启动后进入application:didFinishLaunchingWithOptions方法,该方法内部什么都不实现
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.  
    return YES;
}
      结果:程序启动,屏幕一片漆黑。
      用例1分析:程序启动,didFinishLaunchingWithOptions方法里没有加载任何视图(还有window原因,见下面用例)。
      ** 用例2**:不使用storyboard,程序启动后进入application:didFinishLaunchingWithOptions方法,该方法内部创建添加需要显示的内容。
- (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;
}
      结果:程序启动,屏幕一片漆黑
      ** 用例3**:不使用storyboard,程序启动后进入application:didFinishLaunchingWithOptions方法,该方法内部创建UIWindow,并创建添加需要显示的内容。
- (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的视图,正常。
        用例2+用例3分析:当不用storyboard的时候,AppDelegate被创建完之后,它的window属性为空,需要手动创建之。然后再用它
      ** 用例4**:使用storyboard,程序启动后进入application:didFinishLaunchingWithOptions方法,该方法内部创建添加需要显示的内容
        (备注:storyboard里面初始化的控制器为ViewController,并且在相关方法输出了_cmd)
- (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] 
        分析用例4:tableviewController的界面不显示,可能是被viewController界面覆盖了,还是某种原因。
     ** 用例5**:使用storyboard,程序启动后进入application:didFinishLaunchingWithOptions方法,该方法内部创建添加需要显示的内容
- (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] 
       结果(当执行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] 
        分析用例5: 当info.plist里面有值时,程序先加载storyboard中的对象,并创建之,之后根据程序入口(辣个箭头)创建window,并处理window(将初始控制器赋值给window的rootViewController),然后调用application:didFinishLaunchingWithOptions方法
说明:
1.window的rootViewController会覆盖windows上的子视图。
2. 如果使用storyboard的情况下,[self.window makeKeyAndVisible]方法会在方法application:didFinishLaunchingWithOptions结束后,隐式调用;当然也可以显示调用,window提前显示到了屏幕上。例如上面用例结果1,如果[self.window makeKeyAndVisible]显示写在 NSLog(@"here3");之前,则 输出“TableViewController : viewDidLoad” 在“here3”之前
-------结论:
        使用storyboard的时候,先创建storyboard里面对象,处理appDelegate的window,之后调用相关代理方法didFinish...,之后如果需要再调用[makeKeyAndVisible]
----------------------------------
--------------总结--------------
不管什么方式xib、代码手动、还是storyboard,其实做的事情一样,只是途径不一样,都是创建了window和根控制器,并赋值rootViewController,并显示窗口
--------------备注--------------
          a.关于Application如何查找对应的plist文件?  当一个target创建完,它自动关联了一个plist文件(名字一般是target.plist),如果我们修改了该plist文件名或者该文件被删除,导致target找不到该plist文件,则进入target info界面的时候要要求选择 plist文件,如下图:
          b.UIWindow里面有UIScreen,属性,但是创建UIWindow还是用的[UIScreen mainScreen]。


推荐阅读
  • 使用C++编写程序实现增加或删除桌面的右键列表项
    本文介绍了使用C++编写程序实现增加或删除桌面的右键列表项的方法。首先通过操作注册表来实现增加或删除右键列表项的目的,然后使用管理注册表的函数来编写程序。文章详细介绍了使用的五种函数:RegCreateKey、RegSetValueEx、RegOpenKeyEx、RegDeleteKey和RegCloseKey,并给出了增加一项的函数写法。通过本文的方法,可以方便地自定义桌面的右键列表项。 ... [详细]
  • 修复安装win10失败并提示“磁盘布局不受UEFI固件支持”的方法
    本文介绍了修复安装win10失败并提示“磁盘布局不受UEFI固件支持”的方法。首先解释了UEFI的概念和作用,然后提供了两种解决方法。第一种方法是在bios界面中将Boot Mode设置为Legacy Support,Boot Priority设置为Legacy First,并关闭UEFI。第二种方法是使用U盘启动盘进入PE系统,运行磁盘分区工具DiskGenius,将硬盘的分区表设置为gpt格式,并留出288MB的内存。最后,通过运行界面输入命令cmd来完成设置。 ... [详细]
  • iOS Xcode汇编模式切换的方法介绍
    一、概念 1.汇编指令:模拟器上运行的是Intel指令,而真机上运行的是arm指令, 2.每条汇编指令的格式总是由: 操作码,操作 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • iOS Swift中如何实现自动登录?
    本文介绍了在iOS Swift中如何实现自动登录的方法,包括使用故事板、SWRevealViewController等技术,以及解决用户注销后重新登录自动跳转到主页的问题。 ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • iOS 苹果开发证书失效的解决方案(Failed to locate or generate matching signing assets)
    从2月14日开始,上传程序的同学可能会遇到提示上传失败的提示.并且打开自己的钥匙串,发现所有的证书全部都显示此证书签发者无效.出现以下情况:Failedtolocateorgene ... [详细]
  • 在应用开发中少不了界面元素的布局、适配、自适应。之前苹果已经为我们提供了 AutoLayout 和 SizeClasses,方便我们实现页面的自适应弹性布局。但对于一些复杂的交互界 ... [详细]
  • 本文主要复习了数据库的一些知识点,包括环境变量设置、表之间的引用关系等。同时介绍了一些常用的数据库命令及其使用方法,如创建数据库、查看已存在的数据库、切换数据库、创建表等操作。通过本文的学习,可以加深对数据库的理解和应用能力。 ... [详细]
  • MySQL语句大全:创建、授权、查询、修改等【MySQL】的使用方法详解
    本文详细介绍了MySQL语句的使用方法,包括创建用户、授权、查询、修改等操作。通过连接MySQL数据库,可以使用命令创建用户,并指定该用户在哪个主机上可以登录。同时,还可以设置用户的登录密码。通过本文,您可以全面了解MySQL语句的使用方法。 ... [详细]
  • MVC设计模式的介绍和演化过程
    本文介绍了MVC设计模式的基本概念和原理,以及在实际项目中的演化过程。通过分离视图、模型和控制器,实现了代码的解耦和重用,提高了项目的可维护性和可扩展性。详细讲解了分离视图、分离模型和分离控制器的具体步骤和规则,以及它们在项目中的应用。同时,还介绍了基础模型的封装和控制器的命名规则。该文章适合对MVC设计模式感兴趣的读者阅读和学习。 ... [详细]
  • 本文介绍了MVP架构模式及其在国庆技术博客中的应用。MVP架构模式是一种演变自MVC架构的新模式,其中View和Model之间的通信通过Presenter进行。相比MVC架构,MVP架构将交互逻辑放在Presenter内部,而View直接从Model中读取数据而不是通过Controller。本文还探讨了MVP架构在国庆技术博客中的具体应用。 ... [详细]
  • 本文介绍了iOS开发中检测和解决内存泄漏的方法,包括静态分析、使用instruments检查内存泄漏以及代码测试等。同时还介绍了最能挣钱的行业,包括互联网行业、娱乐行业、教育行业、智能行业和老年服务行业,并提供了选行业的技巧。 ... [详细]
author-avatar
时间证明一2602891163
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有