秀一下自己的专业性吧.O(∩_∩)O~
说的不好,请指点:
程序启动,和C语言一样是先加载.m
文件,那我们看看main.m文件中的内容吧;
int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
内部启动一个叫UIApplicationMain()程序
这里附上苹果的官方说明
Most of the work is done by the UIApplicationMain function, which is automatically called in your project’s main.m source file. The UIApplicationMain function creates an application object that sets up the infrastructure for your app to work with the iOS system. This includes creating a run loop that delivers input events to your app.
大致意思是说:启动过程中很多工作上交给UIApplicationMain这个函数来做的.会创建一个application的对象去设置你IOS系统的公共部分,并且包括创建一个runloop用来进行实践的传递.
// 这个叫UIApplicationMain会创建两个重要的组件
The call to UIApplicationMain creates two important initial components of your app:
// 一个是 UIApplication的实例对象,application
An instance of the UIApplication class, called the application object.
// 主要用在处理 事件的循环 和调整别的优先级高的app 行为,虽然定义在UIKit框架中,但并不要求你自己去定义.
The application object manages the app event loop and coordinates other high-level app behaviors. The UIApplication class, defined in the UIKit framework, doesn’t require you to write any additional code to get it to do its job.
// 另一个是APPDelegate,是app的代理
An instance of the AppDelegate class, called the app delegate.
// Xcode创建这个类为你设置单一视图应用程序模板的一部分。应用程序委托创建窗口,应用程序的内容,并提供一个地方应对状态转换中的应用。应用程序委托你编写定制app-level代码。像所有的类,在AppDelegate类中定义两个源代码文件在你的应用程序:在接口文件,AppDelegate。AppDelegate.m h,实现文件
Xcode created this class for you as part of setting up the Single View Application template. The app delegate creates the window where your app’s content is drawn and provides a place to respond to state transitions within the app. The app delegate is where you write your custom app-level code. Like all classes, the AppDelegate class is defined in two source code files in your app: in the interface file, AppDelegate.h, and in the implementation file, AppDelegate.m.
As your app starts up, the application object calls predefined methods on the app delegate to give your custom code a chance to do its job—that’s when the interesting behavior for an app is executed.
通过查看官方文档,将把程序启动的过程做一个总结
1.执行main.m
2.执行UIAppliMain();
3.创建UIApplication和APPDelegate的实例对象
4.开启主运循环执行app任务(让app不被关闭)
5.加载info.plist.(对不住了,我不知道这段文档写在那个地方了)(其实info中的内容就是预加载项,只不过是以plist文件写成的).
6.根据info.plist中的内容加载对应的Main(显示控制器).
在这里就要分情况了:
1.设置了Main, (并在storyboard的中勾选了
)
[千万不要小看这个属性,当初我可是吃了不小的亏.](属性是设置显示的原始页面. 就是是否显示的意思)
那就直接加载Main.storyboard就行了.
2.没有的话(我很喜欢自己去创建,很有成就感,O(∩_∩)O哈哈~).
我先说明方式,在详细说明
自己手动添加. 刚才说appdelegate是用于处理应用的一些固定的行为, 在里面我们可以看到这么一个方法:-application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
应用完成加载后,调用 . 那我们可以在这里面去创建窗口,并且加载控制器. (因为这个代理中本来就给了我们一个window属性.(窗口))
简单的创建代码附上
// 建立窗口
self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
// 设置根控制器
UIViewController *vc = [[UIViewController alloc]init];
vc.view.backgroundColor = [UIColor redColor];
self.window.rootViewController = vc;
// 显示窗口
[self.window makeKeyAndVisible];
现在详细说明一下appdelegate中的一些方法
// 加载应用完成时调用
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
return YES;
}
// 程序失去焦点,也就是即将进入后台
- (void)applicationWillResignActive:(UIApplication *)application {
}
// 程序进入后台
- (void)applicationDidEnterBackground:(UIApplication *)application {
}
// 程序即将进入前台
- (void)applicationWillEnterForeground:(UIApplication *)application {
}
// 程序获得焦点
- (void)applicationDidBecomeActive:(UIApplication *)application {
}
// 程序进入终端(一般式有东西打扰,打电话什么的)
- (void)applicationWillTerminate:(UIApplication *)application {
}
打字好累,请允许我拷贝我以前写过的一些笔记:
主main函数中调用了 UIApplicationMain函数其中后两个参数是: principalClassName:UIApplication的类名(传空就是默认)
delegateClassName:代理的类名.
执行过程如下:
1.创建UIApplication对象.
2.创建UIApplication的代理对象,并且设置为UIApplication的代理
3.开启一个主运行循环,处理事件
4.加载info.plist文件,判断是否有Main.storyboard描述的控制器
5.加载Main.storyboard
(内部自动执行) (如果没有可以手动去进行设置.)
5.1 创建窗口
5.2 加载Main.storyboard,初始化stroyboard描述的控制器
5.3 设置窗口的根控制器,并且显示窗口
手动设置:
- 创建窗口,并引用.
2.设置窗口的根控制器(不能直接添加view,必须设置为根控制器,负责不能出现转屏功能)
3.设置窗口为应用程序的主窗口(这样才能显示)
关于窗口—> 窗口是有优先级的 (而且程序默认就有一个窗口的设置(状态栏))
窗口的优先级windowLevel 层级: alert(2000) > statusBar(1000) > normal(0)