iOS app 程序启动原理

Info.plist:

常见设置

    建立一个工程后,会在Supporting files文件夹下看到一个"工程名-Info.plist"的文件,该文件对工程做一些运行期的配置,非常重要,不能删除.

    在旧版Xcode创建的工程中,这个配置文件的名字叫做"Info.plist".

    项目中的其他plist文件不能带有"Info"这个字眼,不然会被错认为是传说中非常重要的"Info.plist".

    项目中还有一个"InfoPlist.strings"的文件,跟Info.plist文件的本地化相关.

Info.plist常见属性:

    1> Localiztion native development region (CFBundleDevelopmentRegion)-本地化相关;

    2> Bundle display name(CFBundleDisplayName)-程序安装后显示的名称,限制在10-12个字符,如果超出,将被显示缩写名称;

    3> Icon file(CFBundleIconFile)-app图标名称,一般为Icon.png;

    4> Bundle version(CFBundleVersion)-应用程序的版本号,每次往App Store上发布一个新版本时,需要增加这个版本号;

    5> Main storyboard file base name(NSMainStoryboardFile)-主storyboard文件名称;

    6> Bundle identifier(CFBundleIdentifier)-项目的唯一标识,部署到真机时用到;

pch文件

    项目的Supporting files文件夹下面有个"工程名-Prefix.pch"文件,也是一个头文件;

    pch头文件的内容能被项目中的其他所有源文件共享和访问;

    一般在pch头文件中定义一些全局的宏;

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

1
2
3
4
5
#ifdef DEBUG
#define Log(...) NSLog(__VA_ARGS__)
#else
#define Log(...) /* */
#endif

UIApplication

    UIApplication对象是应用程序的象征;

    每一个应用都有自己的UIApplication对象,而且是单例的;

    通过[UIApplication sharedApplication]可以获得这个单例对象;

    一个iOS程序启动后创建的第一个对象就是UIApplication对象;

    利用UIApplication对象,能进行一些应用级别的操作.

UIApplication的常用属性

    设置应用程序图标右上角的红色提醒数字:

1
@property(nonatomic) NSInteger applicationIconBadgeNumber;

    设置联网指示器(菊花)的可见性

1
@property(nonatomic,getter=isNetworkActivityIndicatorVisible) BOOL networkActivityIndicatorVisible;

iOS7中的状态栏

    从iOS7开始,系统提供了两种管理状态栏的方式:

    1> 通过UIViewController管理(在iOS中,默认情况下,状态栏都是由UIViewController管理的):

    状态栏的样式:

1
- (UIStatusBarStyle)preferredStatusBarStyle;

    状态栏的可见性

1
- (BOOL)prefersStatusBarHidden;

    2> 通过UIApplication管理(一个应用程序的状态栏都由它统一管理)

1
application.statusBarHidden = NO;

openURL:

    UIApplication有个功能十分强大的openURL方法:

1
- (BOOL)openURL:(NSURL*)url;

openURL:方法的部分功能有

    1>打电话

1
2
UIApplication *app = [UIApplication sharedApplication];
[app openURL:[NSURL URLWithString:@"tel://10086"]];

    2>发短信

1
[app openURL:[NSURL URLWithString:@"sms://10086"]];

    3>发邮件

1
[app openURL:[NSURL URLWithString:@"mailto://447640819@qq.com"]];

    4>打开一个网页资源

1
[app openURL:[NSURL URLWithString:@"http://m.baidu.com"]];

    5>打开其他app程序

UIApplication和delegate

    所有的移动操作系统都有个致命的缺点:app很容易受到打扰.比如一个来电或者锁屏会导致app进入后台甚至被终止;

    还有很多其他类似的情况会导致app受到干扰,在app受到干扰时,会产生一些系统事件,这时UIApplication会通知它的delegate对象,让delegate来处理这些系统事件.

delegate可处理的事件包括:

    1> 应用程序的生命周期事件(如程序的启动和关闭);

    2> 系统事件(如来电);

    3> 内存警告...

UIApplicationDelegate协议

1
2
3
4
5
6
// app接收到内存警告时调用
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application;
// app进入后台时调用(比如按了home键)
- (void)applicationDidEnterBackground:(UIApplication *)application;
// app启动完毕时调用
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;

    每次新建完项目,都有个带有"AppDelegate"字眼的类,它就是UIApplication的代理,AppDelegate默认已经遵守了UIApplicationDelegate协议,已经是UIApplication的代理;

UIWindow

    UIWindow是一种特殊的UIView,通常在一个App中只会有一个UIWindow;

    iOS程序启动完毕后,创建的第一个视图控件就是UIWindow,接着创建控制器的View,最后将控制器的view添加到UIWindow上,于是控制器的view就显示在屏幕上了.

    一个程序之所以能显示在屏幕上,完全是因为它有UIWindow,没有UIWindow,就看不见任何UI界面;

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

    1> 直接将view添加到UIWindow中,但并不会理会view对应的UIViewController

1
- (void)addSubview:(UIView *)view;

    2> 自动将rootViewController的view添加到UIWindow中,负责管理rootViewController的生命周期;

1
@property(nonatomic,retain) UIViewController *rootViewController;

常用方法:

1
2
 - (void)makeKeyWindow;  //让当前UIWindow变成keyWindow(主窗口)
 - (void)makeKeyAndVisible;  //让当前UIWindow变成keyWindow,并显示出来

UIWindow的获得:

1
[UIApplication sharedApplication].windows

    在本应用中打开的UIWindow列表,这样就可以接触应用中的任何一个UIView对象(平时输入文字弹出的键盘,就处在一个新的UIWindow中).

1
[UIApplication sharedApplication].keyWindow

    用来接收键盘以及非触摸类的消息事件的UIWindow,而且程序中每时每刻只能有一个UIWindow是keyWindow.如果某个UIWindow内部的文本框不能输入文字,可能是因为这个UIWindow不是keyWindow.

1
view.window

    获得某个UIView所在的UIWindow.

下图是一个iOS程序启动的完整过程:

    

    main函数中执行了一个UIApplicationMain这个函数.

1
2
3
4
5
6
7
8
int main(int argc, char * argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([JNAppDelegate class]));
    }
}
 
int UIApplicationMain(int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName);

    argc, argv:直接传递给UIApplicationMain进行相关处理即可;

    principalClassName:指定应用程序类名(app象征),该类必须是UIApplication(或子类).如果为nil,则用UIApplication类作为默认值.

    delegateClassName:指定应用程序的代理类,该类必须遵守UIApplicationDelegate协议.

    UIApplicationMain函数会根据principalClassName创建UIApplication对象,根据delegateClassName创建一个delegate对象,并将该delegate对象赋值给UIApplication对象中的delegate属性.

    接着会建立应用程序的Main Runloop(事件循环),进行事件的处理(首先会在程序启动完毕后调用delegate对象的application:didFinishLaunchingWithOptions:方法)

    程序正常退出时UIApplicationMain函数才返回.

    

iOS app 程序启动原理的更多相关文章

  1. iOS APP程序启动原理

    UIApplication 程序启动原理 一个应用程序运行就必须要有一个进程,一个进程至少要有一个线程,我们把这个线程叫做主线程,主线程开启之后会开启一个主运行循环,如果不开启一个运行循环,程序开启了 ...

  2. iOS开发 - App程序启动原理

    Info.plist和pch文件的作用 建立一个project后,会在Supporting files目录下看到一个"project名-Info.plist"的文件,该文件对pro ...

  3. iOS程序启动原理---iOS-Apple苹果官方文档翻译

    本系列所有开发文档翻译链接地址:iOS7开发-Apple苹果iPhone开发Xcode官方文档翻译PDF下载地址 //转载请注明出处--本文永久链接:http://www.cnblogs.com/Ch ...

  4. iOS -程序启动原理和UIApplication的介绍

    一.UIApplication 简介       (1)UIApplication对象是应用程序的象征,一个UIApplication对象就代表一个应用程序. (2)每一个Application都有自 ...

  5. iOS App签名的原理

    前言 相信很多同学对于iOS的真机调试,App的打包发布等过程中的各种证书.Provisioning Profile. CertificateSigningRequest.p12的概念是模糊的,导致在 ...

  6. 【腾讯Bugly干货分享】iOS App 签名的原理

    本文来自 WeRead 团队博客: http://wereadteam.github.io/ iOS 签名机制挺复杂,各种证书,Provisioning Profile,entitlements,Ce ...

  7. iOS App的启动过程

    一.mach-O Executable 可执行文件 Dylib 动态库 Bundle 无法被连接的动态库,只能通过 dlopen() 加载 Image 指的是 Executable,Dylib 或者 ...

  8. 怎样做一个iOS App的启动分层引导动画?

    一. 为什么要写这篇文章? 这是一个很古老的话题,从两年前新浪微博开始使用多层动画制作iOS App的启动引导页让人眼前一亮(当然,微博是不是历史第一个这个问题值得商榷)之后,各种类型的引导页层出不穷 ...

  9. iOS开发——UI进阶篇(七)程序启动原理、打电话、发短信

    一.Info.plist常见的设置 1.建立一个工程后,会在Supporting files文件夹下看到一个“工程名-Info.plist”的文件,该文件对工程做一些运行期的配置,非常重要,不能删除 ...

随机推荐

  1. linuxMint下面的截图工具

    sudo apt-get install shutter 然后配合系统快捷键,我定义的和qq的截屏一样的.用着感觉很舒服.

  2. 《UML大战需求分析》阅读笔记5

    流程分析利器三,顺序图. 顺序图描述的是一件事发生的顺序,按照时间的发展,事情的走向,其中分为角色,消息等,每个角色下面都有一条生命线,从上到下,从左到右,依次进行事件,没有事情的时候用虚线表示,而有 ...

  3. The Strategy pattern

    public class Strategy {public static void main(String[] args) {int [] array=new int[]{26,25,15,42,36 ...

  4. JSON: Property 'xxx' has no getter method的解决办法

    在使用JSONArray.fromObject时候出现JSONException:Property 'xxx' has no getter method. 解决办法:设置bean为public属性即可 ...

  5. [UCSD白板题] Changing Money

    Problem Introduction In this problem,you will design an algorithm for changing money optimally. Prob ...

  6. CDATA为何物?

    CDATA的解释 1. 术语 CDATA 指的是不应由 XML 解析器进行解析的文本数据(Unparsed Character Data),XHTML也是如此. CDATA 部分中的所有内容都会被解析 ...

  7. IntelliJ IDEA 发布最新版本13.0.1

    难闻转自:慧都控件网 值得高兴的消息,IntelliJ IDEA v13.0.1目前已经发布,相对于IntelliJ IDEA v13而言,此次更新内容,是略微改进和提高了性能,如代码输入变化,及完善 ...

  8. vim插件神器spf13在Linux上的安装

    官网给出的安装办法很简单: curl http://j.mp/spf13-vim3 -L -o - | sh 可惜有问题: connection reset by peer 正确的姿势是: curl ...

  9. 第52讲:Scala中路径依赖代码实战详解

    今天学习了scala中的路径依赖,来看一下实战代码 class Outer{  private val x = 10  class Inner{    private val y = x +10  } ...

  10. 关于HIVE的数据模型介绍

    (1)Hive数据库 类似传统数据库的DataBase,在第三方数据库里实际是一张表.简单示例命令行 hive > create database test_database; (2)内部表 H ...