ios 应用剖析
在创建HelloWorld的过程中,生成了很多文件(展开Xcode左边的项目导航视图可以看到,如图2-8所示),它们各自的作用是什么?彼此间又是怎样的一种关系呢?
图2-8 项目导航视图
如图2-8所示,导航视图下有HelloWorld、Frameworks和Products三个组。
在HelloWorld组中共有两个类:AppDelegate和ViewController,以及一个组Supporting Files。 我们主要的编码工作就是在AppDelegate和ViewController这两个类中进行的,它们的类图如图2-9所示。
图2-9 HelloWorld工程中的类图
AppDelegate是应用程序委托对象,它继承了UIResponder类,并实现了UIApplicationDelegate委托协议。UIResponder类可以使子类AppDelegate具有处理相应事件的能力,而UIApplicationDelegate委托协议使AppDelegate能够成为应用程序委托对象,这种对象能够响应应用程序的生命周期。相应地,AppDelegate的子类也可以实现这两个功能。
ViewController类继承自UIViewController类,它是视图控制器类,在工程中扮演着根视图和用户事件控制类的角色。需要特别指出的是,ViewController.xib文件也是视图控制文件,起描述作用,与ViewController配套存在。
AppDelegate和ViewController类与main代码模块的主函数存在一种直接的调用关系,下面我们借助UML时序图来进行详细说明,如图2-10所示。
图2-10 HelloWorld启动时序图
可以看到,在HelloWorld启动过程中,首先调用main.m代码模块的main()主函数进行AppDelegate的实例化,具体代码如下所示:
int main(int argc,char*argv[]){@autoreleasepool{returnUIApplicationMain(argc, argv,nil,NSStringFromClass([AppDelegateclass]));}}
AppDelegate类是应用程序委托对象,这个类中继承的一系列方法在应用生命周期的不同阶段会被回调。启动HelloWorld时,首先会调用application:didFinishLaunchingWithOptions:方法,该方法的代码如下:
-(BOOL)application:(UIApplication*)application
didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{self.window =[[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];self.viewController =[[[ViewController alloc]
initWithNibName:@"ViewController" bundle:nil] autorelease];self.window.rootViewController =self.viewController;[self.window makeKeyAndVisible];return YES;}
在该方法中,共做了3件事:实例化UIWindow,实例化ViewController,然后把ViewController作为根视图控制器放到UIWindow上。每一个iOS应用都有一个UIWindow对象,而每一个UIWindow对象上面都一个根视图,它所对应的控制器为根视图控制器(ViewController)。UIWindow对象与根视图UIView之间的关系如图2-11所示。在根视图上,我们可以添加子视图。各种控件(包括UIWindow)都继承了UIView。
图2-11 UIWindow对象与根视图
Supporting Files组共有4个文件。为了便于大家理解,经过分析和提炼,我们将各文件的作用以表的形式向大家总结说明,见表2-1。
表2-1 Supporting Files组文件说明表
| 文件名 | 说明 |
|---|---|
| HelloWorld-Info.plist | 工程属性描述文件,它的命名必须是“工程名+Info.plist” |
| InfoPlist.strings | 工程本地化的字符串文件 |
| main.m | 应用程序的入口程序文件,它不是一个类,其中只有一个main()主函数,应用的运行都是由此开始 |
| HelloWorld-Prefix.pch | 在这个文件中可以引入一些头文件,这样工程中的其他文件就不需要再引入了。它的命名必须是“工程名+ Prefix.pch” |
Frameworks组包含工程里引用到的框架或类库,而Products组是工程将要生成的产品包。
ios 应用剖析的更多相关文章
- iOS CoreAnimation剖析
零.前言 这里没有太多的代码细节,只是探索iOS动画的基本概念,以及其抽象模型,数学基础等.我们学习一个知识的时候一般有两个部分,抽象部分和形象部分,抽象好比语言的语法,是规则,形象好比具体的句子,可 ...
- 【转】 iOS开发 剖析网易新闻标签栏视图切换(addChildViewController属性介绍)
原文:http://blog.csdn.net/hmt20130412/article/details/34523235 本来只是打算介绍一下addChildViewController这个方法的,正 ...
- iOS开发 剖析网易新闻标签栏视图切换(addChildViewController属性介绍)
本文转载至 http://www.tuicool.com/articles/3ymMzub CSDN博客原文 http://blog.csdn.net/hmt20130412/article/det ...
- iOS 人机交互指导方针(iOS Human Interface Guidelines)
iOS 人机交互指导方针(iOS Human Interface Guidelines) 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名 ...
- iOS系列 基础篇 01 构建HelloWorld,剖析并真机测试
iOS基础 01 构建HelloWorld,剖析并真机测试 前言: 从控制台输出HelloWorld是我们学习各种语言的第一步,也是我们人生中非常重要的一步. 多年之后,我希望我们仍能怀有学习上进的心 ...
- 【Xamarin挖墙脚系列:Xamarin.IOS机制原理剖析】
原文:[Xamarin挖墙脚系列:Xamarin.IOS机制原理剖析] [注意:]团队里总是有人反映卸载Xamarin,清理不完全.之前写过如何完全卸载清理剩余的文件.今天写了Windows下的批命令 ...
- iOS学习——布局利器Masonry框架源码深度剖析
iOS开发过程中很大一部分内容就是界面布局和跳转,iOS的布局方式也经历了 显式坐标定位方式 --> autoresizingMask --> iOS 6.0推出的自动布局(Auto La ...
- 新浪微博资深大牛全方位剖析 iOS 高级面试
第1章 课程简介本章对这门课程所讲述内容进行概要介绍,其中包括课程目标.适合人群,课程特色.课程收获.课程安排等.整个课程学习完结后,有机会获得电话模拟面试及内推. 1-1 课前必读(不看会错过一个亿 ...
- 学习笔记:iOS 视图控制器(UIViewController)剖析
转自:http://www.cnblogs.com/martin1009/archive/2012/06/01/2531136.html 视图控制器在iOS编程中占据非常重要的位置,因此我们一定要掌握 ...
随机推荐
- 对于观察者模式,Reactor模式,Proactor模式的一点理解
最近就服务器程序IO效率这一块了解一下设计模式中的Reacotr模式和proactor模式,感觉跟观察者模式有些类似的地方,网上也看了一些其他人对三者之间区别的理解,都讲得很仔细,在此根据自己的理解做 ...
- iOS SEL的简单总结
@interface Person : NSObject + (void)test1; - (void)test2; @end // 根据.h文件中定义的Person类和方法 执行完这行代码 在内存中 ...
- JQGrid+Nhibernate+Webservice+Linq
先上效果图: 前台代码(jqgridtest.aspx): <%@ Page Language="C#" AutoEventWireup="true" ...
- WebApi传递JSON参数
开发过程中经常进行JSON的传递,在WebApi中传递JSON字串时,会发现服务器端接收到不参数值,看下面代码 服务端: public void Post([FromBody]string value ...
- 51nod1256乘法逆元
1256 乘法逆元 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注给出2个数M和N(M < N),且M与N互质,找出一个数K满足0 < K < ...
- 使用Dreamweaver批量删除PHP项目中的单行注释和多行注释
1.删除单行注释 打开Dreamweaver的查找工具,选择正则替换如图: 里面的//.*是正则匹配单行注释的表达式 2.删除多行注释 同样用正则查找匹配,直接上图咯: 其中正则表达式为/\*[ ...
- java----线程篇
一个线程是进程内的一个单一的顺序控制流程图,多线程是指一个进程可以同时运行几个任务,每个任务由一个线程来完成.即多个线程可以同时运行,并且在一个进程内执行不同的任务. 1.创建线程两种方法方法一, 继 ...
- 【刷机】Google Nexus s 蓝牙点击异常,无法启动,刷机解决方案
1 问题详述 手头上有一部Google Nexus S ,本机自带的输入法不好用,想下载其他的输入法,想用蓝牙传输一下apk文件,点了一下蓝牙开关想要打开蓝牙功能,但奇怪的情况出现了,手机一直重启, ...
- C# 将list<>泛型集合 转化为 DataTable
使用案例:将页面easy ui 中datagrid表格中的数据,存成json字符串, 通过ajax和ashx传入C#将string类型的json字符串解析成list<>泛型集合, 由于业务 ...
- 父子进程间通信模型实现(popen)
0.FILE *popen(const char *command, const char *type); popen 函数相当于做了以下几件事: 1.创建一个无名管道文件 2. fork() 3.在 ...