关闭

iOS-ui-application_run_based_view

277人阅读 评论(0) 收藏 举报
分类:
本质
程序运行时的交互。
结构
设置为代理并实现特定协议。


// 新版xcode自动创建的工作,传入AppDelegate给sdk内核。
#import "AppDelegate.h"


int main(int argc, char * argv[]) {
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}


推导发散
点击运行一个应用时,系统的启动代码会执行main函数,然后执行UIApplicationMain函数。UIApplicationMain里面会提供机会,与用户的代码进行交互。这个机会就是回调,就是委托函数,比如:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
应用程序最初要做的东西就放在这个函数里面。
回调函数(委托)就像一个篮子,是系统提供的,你只需要往里面放苹果,系统就可以吃到。你需要做两件事:一是认得这个篮子,二是实现这个篮子。
这就是模块交互的一个实用模式:我提供一个协议,协议里面有很多函数,我在必要时执行这些函数;你作为委托并实现这个协议,并让我知道(我只需要记录这一类的对象就可以了,不需要知道具体是什么对象),这样执行就可以从我的代码跳到你的代码。
对于应用来说,可以在这个函数里面显示你的启动界面、显示你的主界面。


ios4.0里面的应用都是单任务,一个应用一切换到后台(按一下home键)就退出。但ios4.0以后,都是可以在后台运行的,这时切换到后台时会执行一个回调(就算是ios4.0也会在切换至后台时执行这个函数):
- (void)applicationDidEnterBackground:(UIApplication *)application 
在这个交互里面可以做很多事情,比如你可能要做好退出的准备了(比如统计),因为退出程序时是没有通知的,而退出程序的操作是要先切换到后台的。就算是关机也是先切换到后台的。
比如你可能在后台时不需要一个不断执行的界面操作以降低cpu的占用,就可以在这个回调里面停止了。


当重新切换至界面时,执行回调:
- (void)applicationWillEnterForeground:(UIApplication *)application


以上描述说到了系统与应用间的交互,关键是委托的出现。那么这个委托是在什么时候生成的?它是怎么关联到AppDelegate的?


对于基于view的应用程序(在创建工程时可以选择此类),它的主xib叫MainWindow.xib,这个名字在plist里面可以看到。程序在启动时,会加载这个xib,然后创建xib里面指定的实例。MainWindow.xib里面指定的实例是什么看xib就知道:
五个图标,从上往下,File’s Owner、First Responder、uiTest2AppDelegate、uiTest2ViewController、Window,后面三个就是指定的实例,一个是委托,一个是viewController,一个是window。如果你在uiTest2ViewController的viewDidLoad里面下断点,就可以看得出,这个viewController先给创建,然后才有application ::didFinishLaunchingWithOptions的交互。


所以故事的过程是这样的:
sdk启动程序,加载MainWindow.xib,创建应用委托并设置给自己、创建window与view(controller),完成相关交互。然后,view覆盖在window的上面显示出来(或者被改头换面)。
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:79550次
    • 积分:1630
    • 等级:
    • 排名:千里之外
    • 原创:80篇
    • 转载:0篇
    • 译文:0篇
    • 评论:12条
    最新评论