iOS应用程序工程文件以及启动流程

    • iOS程序启动流程

      • 完整启动流程
      • UIApplicationMain方法
      • UIApplication
      • AppDelegate代理生命周期回调
      • UIWindow
      • UIViewController控制器
      • 控制器View的加载
    • iOS工程常见文件
      • xxx-Infoplist文件
      • InfoPliststrings
      • xxx-Prefixpch
      • Defaultpng
      • Iconpng

iOS程序启动流程

1. 完整启动流程

  • 点击程序图标
  • 执行main函数
  • 执行UIApplicationMain函数
  • 创建UIApplication对象、UIApplication的delegate对象
  • 开启事件循环监听系统
  • 程序加载完毕后调用delegate对象的application:didFinishLaunchingWithOptions:方法
    • 创建窗口对象

      self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    • 创建控制器对象

      self.viewController = [[MJViewController alloc] initWithNibName:@"MJViewController" bundle:nil];

    • 设置窗口的根控制器

      self.window.rootViewController = self.viewController;

    • 让窗口成为主窗口、并且可见

      [self.window makeKeyAndVisible];

2. UIApplicationMain方法

??在main.m的main函数中执行了UIApplicationMain这个方法,这是ios程序的入口点

int UIApplicationMain(int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName)
  • argc、argv:ISO C标准main函数的参数,直接传递给UIApplicationMain进行相关处理即可;
  • principalClassName:指定应用程序类,该类必须是UIApplication(或子类)。
  • delegateClassName:指定应用程序类的代理类,该类必须遵守UIApplicationDelegate协议;

    此函数会根据principalClassName创建UIApplication对象,根据delegateClassName创建一个delegate对象,并将该delegate对象赋值给UIApplication对象中的delegate属性;UIApplication对象会依次给delegate对象发送不同的消息,接着会建立应用程序的main runloop(事件循环),进行事件的处理(首先会调用delegate对象的 application:didFinishLaunchingWithOptions:),程序正常退出时这个函数才返回。如果进程要被系统强制杀死,一般这个函数还没来得及返回进程就终止了。

3. UIApplication

  • UIApplication是应用程序的核心,每一个程序在运行期必须有UIApplication(或子类)的一个实例(有且仅有一个),通过[UIApplication sharedApplication]可以得到这个单例实例的指针。
  • UIApplication帮助管理应用程序的生命周期,而它通过delegate来履行这个任务。
  • UIApplication可以接收事件,把所有用户事件都放入队列,逐个处理,它会发送当前事件给一个合适的目标控件进行处理。它还将部分事件转给delegate对象来处理,delegate可处理的事件包括:应用程序的生命周期事件(如程序启动和关闭)、系统事件(如来电)
- (IBAction)click {
    UIApplication *app =  [UIApplication sharedApplication];
    //影藏显示状态栏
    app.statusBarHidden = No;
    // 设置图标右上角的数字
    app.applicationIconBadgeNumber = 0;
    // 设置是否需要显示网络连接状态
    app.networkActivityIndicatorVisible = YES;
    // 打电话\发短信\发邮件\打开safari浏览器
    NSURL *url = [NSURL URLWithString:@"tel://10086"];
    NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
    [app openURL:url];
}

4. AppDelegate代理(生命周期回调)

??UIApplicationMain方法根据第四个参数delegateClassName生成应用程序类的代理(该类必须遵守UIApplicationDelegate协议),然后设置给UIApplication。应用程序生命周期发生变化就会调用AppDelegate代理中的方法。

@implementation MJAppDelegate

#pragma mark 在应用程序启动完毕后调用(只会调用一次,第一次打开程序的时候才会调用)
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{}

#pragma mark 在app进入前台的时候调用
- (void)applicationWillEnterForeground:(UIApplication *)application{}
#pragma mark 当app获得焦点的时候调用(已激活)
- (void)applicationDidBecomeActive:(UIApplication *)application{}

#pragma mark 当app失去焦点的时候调用(未激活)
- (void)applicationWillResignActive:(UIApplication *)application{}
#pragma mark 在app进入后台的时候调用
- (void)applicationDidEnterBackground:(UIApplication *)application{}

#pragma mark 当app被关闭的时候会调用(前提条件:app在后台运行的时候)
- (void)applicationWillTerminate:(UIApplication *)application{}
@end

5. UIWindow

??UIWindow是一种特殊的UIView,通常在一个app中只会有一个UIWindow,但可以手动创建多个UIWindow。

UIWindow的主要作用:

①、提供一个区域来显示视图

②、将事件分发给视图

③、与UIViewController协同工作,方便完成设备方向旋转的支持

添加UIView到UIWindow中两种常见方式:

①、addSubview:直接将UIView添加到UIWindow中,程序负责维护UIView的生命周期以及刷新,但并不会理会UIView对应的UIViewController

②、rootViewController:自动将UIViewController对应的UIView添加到UIWindow中,同时负责维护UIViewController和UIView的生命周期

常用方法

makeKeyWindow:让当前UIWindow变成keyWindow

makeKeyAndVisible:让当前UIWindow变成keyWindow,并显示出来

6. UIViewController控制器

??UIViewController属于MVC模型中的C(Controller),说的更具体点它是一个视图控制器,管理着一个视图(UIView)。

??一个UIViewController应该只管理一个view hierarchy,通常来说一个完整的view hierarchy指的是占满整一个屏幕。而很多app满屏中会有各个区域分管不同的功能,一些开发者喜欢直接新建一个UIViewController和一套相应的view来完成所要的功能,这样做完全不符合Apple提供的设计规范。

UIViewController生命周期方法:

①、当view加载后调用viewDidLoad,这里可以进行一些数据的请求或加载,用来更新界面

②、当view将要被加入view hierarchy时调用viewWillAppear,完成加入时调用viewDidAppear

③、当view将要从view hierarchy中移除时调用viewWillDisappear,完成移除时调用viewDidDisappear

④、当内存紧张时, 调用didReceiveMemoryWarning,其默认实现是如果当前UIViewController的view的superview是nil,则将view释放且调用viewDidUnload, viewDidUnload中你可以进行后继的内存清理工作(主要是界面元素的释放,当再次加载的时候需要重建)

(这里的view是指UIViewController内部的view属性)

7. 控制器View的加载

??应用程序启动后,会调用代理的application:didFinishLaunchingWithOptions:方法,在这个方法中会完成控制器和View的加载。

??控制器MJViewController的view是延迟加载的,用到view时,就会调用控制器的loadView方法加载view,loadView加载view的默认过程(UIViewController的默认实现):

1> 如果nibName有值,就会加载对应的xib文件来创建view
2> 如果nibName没有值
    1) 优先加载MJView.xib文件来创建view
    2) 加载MJViewController.xib文件来创建view
    3) 如果没有找到上面所述的xib文件,就会用代码创建一个黑色的view
@implementation MJAppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // 创建控制器(控制器的view是延时加载:用到时再加载)
    self.viewController = [[MJViewController alloc] initWithNibName:@"MJViewController" bundle:nil];
    // 如果执行下面设置view背景的方法,就会调用loadView加载view
    //self.viewController.view.backgroundColor = [UIColor blueColor];
    // 设置根控制器(没有用到根控制器的view)
    self.window.rootViewController = self.viewController;
    // 设置窗口可见(此时会加载view)
    [self.window makeKeyAndVisible];
    return YES;
}
@implementation MJViewController
#pragma mark 如果不重写loadView,UIViewController默认实现
- (void)loadView{
    // 不应该调用super的loadView
    // [super loadView];
    //NSLog(@"---loadView");
    // 死循环
    //self.view = [[UIScrollView alloc] initWithFrame:self.view.frame];
    // 返回最适合控制器view的frame
    CGRect frame = [UIScreen mainScreen].applicationFrame;
    //NSLog(@"%@", NSStringFromCGRect(frame));
    self.view = [[UIScrollView alloc] initWithFrame:frame];
    self.view.backgroundColor = [UIColor yellowColor];
}*/

#pragma mark view 加载完毕后调用
- (void)viewDidLoad{
    [super viewDidLoad];
    // 初始化子控件
}
@end

iOS工程常见文件

1. xxx-Info.plist文件

??项目中最主要的文件,描述了软件名称、软件版本、唯一标识等,修改Summery相当于修改此文件。相当于Android的清单文件AndroidManifest.xml

??Bundle version -版本号(每次往App Store上发布一个新版本时,需要增加这个版本号)

??Bundle display name - 软件名称(限制在10-12个字符,如果超出,将被显示缩写名称)

??Localiztion native development region-本地化相关

??Icon file-app图标名称,一般为Icon.png

??Main nib file base name-主nib文件的名称

??Bundle identifier-项目的唯一标识,部署到真机时用到

??…

注意: 在Xcode3的时候文件名叫做:Info.plist,所以我们在创建.plist文件时不要取名为Info或者info.plist

2. InfoPlist.strings

??国际化相关配置

3. xxx-Prefix.pch

??一般来说,可以将项目中经常用到的一些头文件放在这里来import,整个项目都可以访问这个文件的内容,这样既节省了手动添加import的时间,也有助于加速编译。在这里定义的宏,整个项目都可以访问。

??示例:在pch文件中添加下列预处理指令,然后在项目中使用Log(…)来输出日志信息,就可以在发布应用的时候,一次性将NSLog语句移除(在调试模式下,才有定义DEBUG)

/*
 如果软件处于调试状态,系统会默认定义一个叫做DEBUG的宏;
 如果软件处于发布打包状态,系统就不会定义DEBUG这个宏
 */
#ifdef DEBUG
// 调试状态:将MJLog替换成NSLog
#define MJLog(...)  NSLog(__VA_ARGS__)
#else
// 发布状态:将MJLog替换成空
#define MJLog(...)
#endif

4. Default.png

??应用程序在启动过程中会全屏显示叫做Default.png的图片,不同屏幕分辨率会加载不同的图片,如果没找到会使用最接近的那张(系统自动识别)

Default.png 320x480

[email protected] 640x960

[email protected] 640x1136

5. Icon.png

??应用程序图标

??苹果官方文档搜索”app icon” –>App Icons on iPad and iphone

??

时间: 2024-10-14 16:48:14

iOS应用程序工程文件以及启动流程的相关文章

ios应用程序的两种启动方式

记得几个月前刚接触ios时,因为要急着完成任务,树立运用的办法彻底依照书本,而书本讲的是xcode3,而装的xcode的版别是4.所以,书上的一些东东和xcode的版别对不上,十分烦恼,为了创立一个windows base 的project,都费力了心思. 过了几个月,回到来想想当初的疑问,无非是没有理解xib的原理,没有弄清楚在ios里,假如经过xib来创立目标. 关于xib创立目标,能够从发动开端.咱们来看看windows base project的做法和 single view proje

ios应用程序的两种启动方法

?1.概述 AFNetworking简称AFN,是iOS开发中干流第三方结构之一.苹果的一套结构NSContention发送央求与接纳央求的办法十分繁琐.操作起来很不便利.不只需做差异各种央求设置各种不相同的参数,而且还要经常在多线程里操作,一同还要对央求与回来的数据做各种序列化的操作,一同还要考虑央求数据的安全等成堆疑问.而AFNetworking帮我们简化了网络操作. 2.早前的几个网络结构 1.ASI结构: HTTP终结者.很牛, 但是有BUG, 现已间断更新. 2.MKNetworkKi

iOS应用程序发布AppStore及更新流程

要点: 在iTunes Connect创建应用程序空间 Xcode选择好对应的开发证书(即和应用程序空间一致的证书) 填写好相关的描述信息以及相关的联系信息 iTunes Connect登录网址:https://itunesconnect.apple.com/WebObjects/iTunesConnect.woa 提示:程序更新只需要执行第二步即可 以下是详细的上传过程 首先在iTunes Connect创建空间 跟据(图1.2.3)所示,登录iTunes Connect并且选择好. 如图4所

linux-系统启动流程-7

1,BIOS开机自检,检查cpu硬件及开机启动顺序,查找第一个磁盘磁头的MBR信息并加载BOOtloader,然后将控制权交与bootloader 2, GRUB GRUB(Grand Unified Bootloader),多系统启动程序 stage1 : 查找加载stage 1.5 stage1.5: 可以识别文件系统, 即识别 /boot/ 磁盘第一个分区 stage 2: grub 识别/boot/grub/grub.conf ,根据配置文件,读取Kernel 信息,然后加载kernel

iOS 8 应用构建细节挖掘 之 应用启动流程

太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 24K 标题党! 不过内容绝对够细节而全面,仅针对启动流程这一小块块哟! iOS 应用启动流程,这个话题早在09年就非常熟悉,然而时隔多年,不知是

UI开发----基础视图和程序启动流程(delegate)

//  Create by 郭仔  2015年04月13日22:10:23 今天介绍的基础视图包括:UITextField.UIButton 一.定义UITextField: 创建UITextField与创建UILabel的步骤很相似.? 1.开辟空间并初始化(如果本类有初始化?方法,使?用?自?己的;否则 使?用?父类的).? 2.设置?文本显?示.输?入相关的属性? 3.添加到?父视图上,?用以显?示? 4.释放 UITextField * textField = [[UITextField

发布IOS应用程序到苹果APP STORE完整流程

参考:http://blog.csdn.net/mad1989/article/details/8167529(xcode APP 打包以及提交apple审核详细流程(新版本更新提交审核)) http://www.ttlsa.com/dev/how-to-publish-iosapp-to-appstore/ (如何发布IOS应用程序到苹果APP STORE) 开发环境:xcode5.1.1 iphonesdk:7.1 开发机器:iMac 真机部署测试:apple个人开发者ID 向导: 必备ID

CentOS启动流程、Grub legacy配置、linux kernel模块管理、伪文件系统介绍

写在前面: 博客书写牢记5W1H法则:What,Why,When,Where,Who,How. 本篇主要内容: ● 启动相关基础概念汇总 ● 启动流程 ● init程序类型     /etc/rc.d/rc     chkconfig     /etc/rc.d/rc.sysinit ● GRUB legacy     命令行接口     配置文件 ● Linux Kernel     内核模块查看与管理         lsmod         modinfo         modprob

UI_02 基础视图、程序启动流程

?.UITextField UITextField(输?框):是控制?本输?和显?的控件 UITextField核?功能主要包含3个??: ?本显? 输?控制 外观配置 1.?本显? //    textField.text = @"你好"; //    textField.textAlignment = NSTextAlignmentCenter; textField.textColor = [UIColor blueColor]; textField.placeholder = @