iOS程序启动原理(上)

为什么80%的码农都做不了架构师?>>>   hot3.png

iOS程序启动原理

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)

#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开始,系统提供了两种管理状态栏的方式:

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

    状态栏的样式:

- (UIStatusBarStyle)preferredStatusBarStyle;

    状态栏的可见性

- (BOOL)prefersStatusBarHidden;

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

application.statusBarHidden = NO;

openURL:

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

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

openURL:方法的部分功能有

    1>打电话

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

    2>发短信

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

    3>发邮件

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

    4>打开一个网页资源

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

    5>打开其他app程序

UIApplication和delegate

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

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

delegate可处理的事件包括:

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

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

    3> 内存警告...

UIApplicationDelegate协议

// 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

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

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

@property(nonatomic,retain) UIViewController *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.



转载于:https://my.oschina.net/aofe/blog/268696

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/264813.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

何时使用委托而不使用接口

委托和接口都允许类设计器分离类型声明和实现。给定的接口可由任何类或结构继承和实现;可以为任何类中的方法创建委托,前提是该方法符合委托的方法签名。接口引用或委托可由不了解实现该接口或委托方法的类的对象使用。既然存在这些相似性,那…

microsoft project 出现不能保存为xls文件时可以按照如下方法解决

工具-》选项-》安全性转载于:https://www.cnblogs.com/oymx/p/3753291.html

多功能节点连线绘图控件Nevron Diagram for .NET使用方法及下载地址

Nevron Diagram for .NET是一个功能强大,世界上顶级的.NET图表控件.可扩展的图形报表构架,可以帮您创建功能丰富的Winforms及Webforms图表解决方案。这个产品构建于Nevron表述层框架之上,能为您提供令人激动的视觉冲击,您无法通过其它产品体验…

《DirectX 9.0 3D游戏开发编程基础》 第二章 绘制流水线 读书笔记

模型的表示 场景:物品或模型的集合 任何物品都可以用三角形网络逼近表示。我们经常用以下术语描述三角形网络:多边形(polygons)、图元(primitives)、网络几何单元(mesh geometry)。 描述三角形:指定三个顶点 描述物品:三角形单元列…

CocosCreator2.1.0渲染流程与shader

CocosCreator2.1.0版本正式支持导入3D模型 对于2.5D游戏的开发来说有着重要意义 自己此前在写捕鱼游戏时了解过自定义shader 并实现了4种不同的水波效果 但经过CocosCreator版本的不断升级 尤其是1.10和2.0两个版本 旧的渲染器被抛弃了 因此老的shader特效也全都不能用了 直到最…

Java开发人员的十大戒律

对Java开发者来说,有许多的标准和最佳实践。本文列举了每一个开发人员必须遵从的十大基本法则;如果有了可以遵从的规则而不遵从,那么将导致的是十分悲惨的结局。1. 在你的代码里加入注释每个人都知道这点,但不知何故…

c++学习书籍推荐《Advanced C++》下载

百度云及其他网盘下载地址:点我 作者简介 James Coplien先在威斯康星大学获得电气与计算机工程学士学位,后又在该大学获得计算机科学硕士学位。他在贝尔实验室的软件产品研发部门工作,在这个部门从一开始就使用C程序设计语言。近年来致力于大…

MySQL入门-3:安装与客户端工具

大纲1、安装 MySQL2、检索数据3、数据过滤一、安装环境CentOS-6.5-i386mysql 5.1.73为了方便,这里采用yum方式安装,对于学习实验环境完全没问题,注意下面的操作都以root身份操作。除非对MySQL需要定制化或者安装多个实例,建议使用…

实验吧-web-天下武功唯快不破(Python中byte和str的转换)

题目:看看响应头 打开网站,既然已经提示我们看响应头了,那我们就看看呗(习惯bp,也可直接F12查看) 可以看到,响应头部分有个FLAG,而且有提示:please post what you find with parameter:key 所以…

CodeSmith实用技巧(八):生成的代码输出到文件中

在CodeSmith中&#xff0c;要把生成的代码文件输出到文件中&#xff0c;你需要在自己的模版中继承OutputFileCodeTemplate类。<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /><% CodeTemplate Language"C#"TargetL…

SSH整合jar包下载

2019独角兽企业重金招聘Python工程师标准>>> http://blog.sina.com.cn/s/blog_8a3d83320100zhmp.html svn使用 spring 下载 http://maven.springframework.org/release/org/springframework/spring/4.0.5.RELEASE/ http://repo.spring.io/libs-release-local/org/sp…

三合一剪弦器怎么用_三合一冲锋衣推荐选购攻略:

一、冲锋衣的类别二、三合一冲锋衣小评测。三、冲锋衣维护一、冲锋衣的类别冲锋衣分&#xff1a;硬壳、软壳&#xff0c;三合一&#xff0c;三种类型。软壳是介于抓绒衣和冲锋衣之间的衣服&#xff0c;防水上比硬壳差&#xff0c;只能防小雨&#xff0c;但优势在于活动方便&…

Celery 之异步任务、定时任务、周期任务

什么是Celery?Celery 是芹菜Celery 是基于Python实现的模块, 用于执行异步定时周期任务的其结构的组成是由 1.用户任务 app 2.管道 broker 用于存储任务 官方推荐 redis rabbitMQ / backend 用于存储任务执行结果的 3.员工 worker 一 异步任务 1 from celery import…

堆栈认知——栈溢出实例(ret2libc)

参考&#xff1a;栈溢出实例–笔记三&#xff08;ret2libc&#xff09; 地址&#xff1a;https://qingmu.blog.csdn.net/article/details/119481681 目录1、栈溢出含义及栈结构2、ret2libc基本思路3、实战3.1、二进制程序3.2、查看栈结构3.3、第一次栈溢出3.4、第二次栈溢出1、…

halcon 单通道图像转成3通道_halcon图像处理基本运算

halcon图像处理基本运算图像处理最基本的操作包括颜色空间转换&#xff0c;各种代数运算&#xff0c;放射变换等。通过熟悉这些常见的操作&#xff0c;可以对图像有基本的认识&#xff0c;尤其是对刚开始接触视觉图像处理的人而言&#xff0c;熟悉这些操作&#xff0c;可以快速…

ASP.NET MVC学前篇之Ninject的初步了解

ASP.NET MVC学前篇之Ninject的初步了解1.介绍废话几句&#xff0c;Ninject是一种轻量级的、基础.NET的一个开源IoC框架&#xff0c;在对于MVC框架的学习中会用到IoC框架的&#xff0c;因为这种IoC开源框架有很多&#xff0c;本篇的主题只有一个&#xff0c;就是让阅读过本篇幅的…

技术术语积累

目录ASCII码表ASCII打印字符ASCII非打印控制字符ASCII扩展打印字符C语言基本数据类型整型变量整型常量实数&#xff08;浮点&#xff09;类型实型&#xff08;浮点&#xff09;常量字符变量字符常量C语言中printf打印形式%2d&#xff0c;%-2d&#xff0c;%.2d&#xff0c;%02d&…

下滑加载更多js_专治:卫生间免砸砖,房顶漏水,JS堵漏王水不漏,厂家三包产品,免费成熟配方(点开看更多)...

免砸砖JS-堵漏王水不漏白色粉状&#xff0c;加水溶解后即为JS堵漏王水不漏。防水液&#xff0c;为无色透明液体&#xff0c;不燃、不爆、不腐蚀。本产品是新型多功能纳米水溶性防水剂。具有超强的渗透后微膨胀结晶功能&#xff0c;能充分填补填满物体毛细管&#xff0c;从而达到…

linux设置开机自启动

一.、在/etc/rc.local文件中添加自启动命令 执行命令&#xff1a; 编辑"/etc/rc.local"&#xff0c;添加你想开机运行的命令 运行程序脚本&#xff1a;然后在文件最后一行添加要执行程序的全路径。 例如&#xff0c;每次开机时要执行一个hello.sh&#xff0c;这个脚本…

JavaScript 初学者应知的 24 条最佳实践

原文&#xff1a;24 JavaScript Best Practices for Beginners &#xff08;注&#xff1a;阅读原文的时候没有注意发布日期&#xff0c;觉得不错就翻译了&#xff0c;翻译到 JSON.parse 那一节觉得有点不对路才发现是 2009 年发布的文章&#xff0c;不过还是不错的啦。另外&am…