文档章节

IOS开发学习-程序启动原理

Corwien
 Corwien
发布于 2016/03/31 17:50
字数 1550
阅读 57
收藏 0

一、要点掌握

  • Info.plist和pch文件的作用

  • UIApplication的常见使用

  • AppDelegate的代理方法

  • UIApplication、AppDelegate、UIWindow、UIViewController的关系

  • iOS程序的完整启动过程

二、info.plist常见的设置

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

在旧版本Xcode创建的工程中,这个配置文件的名字就叫“Info.plist”

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

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


Info.plist

常见属性(红色部分是用文本编辑器打开时看到的key)

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

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

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

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

Main storyboard file base name(NSMainStoryboardFile)-主storyboard文件的名称

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


pch文件

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

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

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

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

#ifdef DEBUG

#define Log(...) NSLog(__VA_ARGS__)

#else

#define Log(...) /* */

#endif


什么是UIApplication

UIApplication对象是应用程序的象征

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

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

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

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


UIApplication的常用属性

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

@property(nonatomic) NSInteger applicationIconBadgeNumber;


设置联网指示器的可见性

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


iOS7中的状态栏

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

  • 通过UIViewController管理(每一个UIViewController都可以拥有自己不同的状态栏)

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


  • 在iOS7中,默认情况下,状态栏都是由UIViewController管理的,UIViewController实现下列方法就可以轻松管理状态栏的可见性和样式

状态栏的样式

- (UIStatusBarStyle)preferredStatusBarStyle; 


状态栏的可见性

- (BOOL)prefersStatusBarHidden; 


利用UIApplication来管理状态栏

如果想利用UIApplication来管理状态栏,首先得修改Info.plist的设置


openURL:

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

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


openURL:方法的部分功能有

打电话

UIApplication *app = [UIApplication sharedApplication];

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


发短信

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


发邮件

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


打开一个网页资源

[app openURL:[NSURL URLWithString:@"http://ios.itcast.cn"]];


打开其他app程序

UIApplication *app = [UIApplication sharedApplication];


UIApplication和delegate

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

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

  • delegate可处理的事件包括:

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

  2. 系统事件(如来电)

  3. 内存警告

  4. … …


UIApplicationDelegate协议

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


UIApplicationDelegate

  • 每次新建完项目,都有个带有“AppDelegate”字眼的类,它就是UIApplication的代理


  • MJAppDelegate默认已经遵守了UIApplicationDelegate协议,已经是UIApplication的代理


iOS程序的启动过程


UIApplicationMain

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


int UIApplicationMain(int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName);

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


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


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


UIWindow

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

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

  • 一个iOS程序之所以能显示到屏幕上,完全是因为它有UIWindow

  • 也就说,没有UIWindow,就看不见任何UI界面


添加UICView到UIWindow中常见方式:

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

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

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


@property(nonatomic,retain) UIViewController *rootViewController;

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


常用方法

- (void)makeKeyWindow;

让当前UIWindow变成keyWindow(主窗口)


- (void)makeKeyAndVisible; 

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


UIWindow的获得

  • [UIApplication sharedApplication].windows

在本应用中打开的UIWindow列表,这样就可以接触应用中的任何一个UIView对象

(平时输入文字弹出的键盘,就处在一个新的UIWindow中)


  • [UIApplication sharedApplication].keyWindow

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


  • view.window

获得某个UIView所在的UIWindow


四大对象关系图


© 著作权归作者所有

共有 人打赏支持
Corwien
粉丝 27
博文 149
码字总数 115164
作品 0
广州
程序员
私信 提问
一步一步学习iOS 5编程(第三版)-PDF中文版-正式发布!

目前,这是第一本介绍iOS 5.x 和 Xcode 4.4 的中文版书籍,尤其适合于iOS 编程开发初学者。本教程由 EntLib.com 团队编写。如有任何技术问题,欢迎留言。 电子版 – PDF 格式,支持iPhone、i...

entlib
2012/09/20
0
2
iOS 学习资料整理

视频教程(英文) Developing iOS 7 Apps for iPhone and iPad 斯坦福开放教程之一, 课程主要讲解了一些 iOS 开发工具和 API 以及 iOS SDK 的使用, 属于 iOS 基础视频 iPad and iPhone Applic...

拉偶有所依
2015/01/19
2.2K
4
iOS逆向工程- 学习整理(工具详解)

前言 一、逆向工程的要求 具备丰富的 iOS 开发经验 最好能非常熟悉 iOS 设备的硬件构成,iOS 系统的运行原理。 拿到任意一个 App 之后能够大致推断出它的项目规模和使用的技术,比如它的MVC模...

_小迷糊
2018/05/11
0
0
iOS开发,我的2018进阶之路总结!

4G改变了生活,抓住机会的人已经在这个社会有了立足之地,马上迎来5G的时代,你做好准备了吗! 对于即将迎来的5G时代,无疑会是音视频的又一个高潮!那么作为程序员的我们,应该怎么样去迎接...

_小迷糊
01/08
0
0
10个优秀Objective-C和iOS开发在线视频教程

如果你自己开发iOS应用,你肯定会发现网上有很多资源。学习编程的一个最好的方法就是自己写代码,而开始写代码的最快的方式就是看其他人怎么写。我们从海量视频和学习网站中整理出了我们认为...

mingxun
2014/05/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

容器服务

简介 容器服务提供高性能可伸缩的容器应用管理服务,支持用 Docker 和 Kubernetes 进行容器化应用的生命周期管理,提供多种应用发布方式和持续交付能力并支持微服务架构。 产品架构 容器服务...

狼王黄师傅
昨天
3
0
高性能应用缓存设计方案

为什么 不管是刻意或者偶尔看其他大神或者大师在讨论高性能架构时,自己都是认真的去看缓存是怎么用呢?认认真真的看完发现缓存这一块他们说的都是一个WebApp或者服务的缓存结构或者缓存实现...

呼呼南风
昨天
12
0
寻找一种易于理解的一致性算法(扩展版)

摘要 Raft 是一种为了管理复制日志的一致性算法。它提供了和 Paxos 算法相同的功能和性能,但是它的算法结构和 Paxos 不同,使得 Raft 算法更加容易理解并且更容易构建实际的系统。为了提升可...

Tiny熊
昨天
2
0
聊聊GarbageCollectionNotificationInfo

序 本文主要研究一下GarbageCollectionNotificationInfo CompositeData java.management/javax/management/openmbean/CompositeData.java public interface CompositeData { public Co......

go4it
昨天
3
0
阿里云ECS的1M带宽理解

本文就给大家科普下阿里云ECS的固定1M带宽的含义。 “下行带宽”和“上行带宽” 为了更好的理解,需要先给大家解释个词“下行带宽”和“上行带宽”: 下行带宽:粗略的解释就是下载数据的最大...

echojson
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部