iPhone技术架构
1、Cocoa Touch层(主要是UIKit框架)
管理界面相关的用户交互事件和行为,例如:触摸,滑动,摇摆,并提供“联系人“、”图片“、”重力感应“、”相机“等基础程序框架。
2、Media层
提供声音,图像以及高级图形、动画技术的高层程序框架。
3、OS层
提供系统基础服务,如内核,驱动,以及内存,线程,文件系统,网络,进程通信等操作系统接口。
iPhone程序启动过程
现在我们可以打开Xcode,Create a new Xcode project -> IOSApplication -> Empty Application,然后点击Next,在Product Name中输入Test后点击Next,最后存放文件目录。
呈现在我们面前的是如图所示的文件树图。在main.m中我们可以看到如下代码:
这是IOS典型的加入ARC的启动代码,这里告诉我们3件事情,创建一个autoreleasepool的自动释放内存池,调用UIApplicationMain()函数,该函数返回一个int值,最后释放内存池。这里的核心就是UIApplicationMain(),它接受4个参数。前两个参数是来自于main函数的两个参数,后两个string类型参数分别代表principal class和delegate class,即主要类和代理类。如果principal class为nil,则默认为UIApplication。只要后两个参数任意一个不为nil,UIApplicationMain()函数就会gen根据参数创建相应的功能类。由此不难知道如果你自定义了一个UIApplication的子类(但不建议),你需要讲它作为第三个参数传进来。
UIApplication被实例化后会调用delegate接口的application:didFinishLaunchingWithOptions:。该函数是属于UIApplicationDelege的回调函数,所以程序需要一个主类实现这个接口。幸运的是Xcode5已经自动帮我们创建好了这个类AppDelegate。在AppDelege.h我们可以看到如下代码:
#import <UIKit/UIKit.h> @interface AppDelegate : UIResponder <UIApplicationDelegate> @property (strong, nonatomic) UIWindow *window; @end
这里很明显就看出我们的AppDelegate是继承UIResponder并且实现UIApplicationDelegate接口,同时申明了一个UIWindow的指针_window,其中的参数分别为strong和nonatomic,这两参数现在只简单说下,strong是为ARC技术防止死锁而设定的,nonatomic是非原子性,是和线程相关,我们现在不必关心这两个参数,只是稍作了解。
接下来在.m文件中我们可以看到application:didFinishLaunchingWithOptions:这个函数的具体内容:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // Override point for customization after application launch. self.window.backgroundColor = [UIColor whiteColor]; [self.window makeKeyAndVisible]; return YES; }
里面有关与UIWindows的具体操作,我们以后会提到。这里同样稍作了解。第一句是申请内存并且初始化边框为主屏幕大小,第二句设定窗体背景颜色为白色,第三句话让window可见并显示在屏幕上。
于是现在我们讲程序运行在iPhone虚拟机上就可以看到下面的图片:
没错,就是一块白色的窗体,并且什么都没有。折腾了这么半天,你才发现你什么也没做。但不要沮丧,对于新手来说理解IOS程序是如何运行的机制是需要的,当我们知道如何启动一个IOS程序,才能往里面添加你想要的内容。前提是你需要知道它是如何启动的,幸运的是这篇文章就是告诉你IOS程序启动的原理。j接下来欢迎进入IOS开发的世界!