您的位置:首页 > 移动开发 > IOS开发

Xcode4.2以后iOS应用的启动顺序变化

2013-05-22 21:47 288 查看




以上是Xcode4.2中不采用storyboard应用的默认启动流程图。对于采用了storyboard的应用,UIApplicationMain()将会额外加载应用的主要storyboard文件,从而创建窗口和初始视图。

main()的变化

main()仍然是应用的起点,其代码如下:

int main(int argc, char *argv[])

{

@autoreleasepool {

return UIApplicationMain(argc,
argv, nil,NSStringFromClass([AppDelegate class]));

}

}

main()采用了新的@autoreleasepool{}函数,以便支持LLVM3.0。但这一变化不会影响应用 的启动顺序。需要注意的是UIApplicationMain第四个参数的变化,之前是nil,而这里已经更改了。如果查看相关文档(https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIKitFunctionReference/Reference/reference.html#//apple_ref/doc/uid/TP40006894-CH3-SW7),就会知道第四个参数代表“应用的delegate初始化的类名”,如果从应用的主nib文件加载代理对象,则将该参数指定为nil。

显然,我们的应用代理将不会由之前的MainWindow.xib加载,而是直接由UIApplicationMain()函数创建。实际上,项目中已经不再有MainWindow.xib文件。

在Xcode4.2及以后版本去掉main
nib文件的原因很可能是storyboarding的导入。storyboards基于视图控制器,而非视图或窗口。

最后,对于non-storyboarding的应用,由于取消了MainWindow.xib,因此在AppDelegate.m中的didFinishLauchingWithOptions:方法中就需要增加一些初始化的代码,如下:

- (BOOL)application:(UIApplication*)application
didFinishLaunchingWithOptions:(NSDictionary*)launchOptions

{

self.window =
[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

//
Override point for customization after application launch.

if([[UIDevice currentDevice] userInterfaceIdiom]
== UIUserInterfaceIdiomPhone)
{

self.viewController =
[[ViewController alloc] initWithNibName:@"ViewController_iPhone" bundle:nil];

} else {

self.viewController =
[[ViewController alloc] initWithNibName:@"ViewController_iPad" bundle:nil];

}

self.window.rootViewController = self.viewController;

[self.window makeKeyAndVisible];

return YES;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: