iOS 温故知新之 Main函数和UIApplication

如同C/C++程序都有一个入口函数Main函数一样,iOS app开发也有相同的入口main函数。

然而今天发现在修改老版本的程序发现,跟新版xcode创建出来的main函数有一点不同

这是现在使用Xcode6.3创建的main函数代码:

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

@autoreleasepool {

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

}

}

这是4.2以前版本Xcode改成ARC后main函数代码的样子:

1 int main(int argc, char *argv[])
2 {
3     @autoreleasepool{4         int retVal = UIApplicationMain(argc, argv, nil, nil);
5         return retVal;
6     }7 }

发现UIApplicationMain函数传递的参数也有不同,为什么不最后一个参数变了呢?

UIApplicationMain()函数是程序的入口

UIKIT_EXTERN int UIApplicationMain(int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName);

// If nil is specified for principalClassName, the value for NSPrincipalClass from the Info.plist is used. If there is no

// NSPrincipalClass key specified, the UIApplication class is used. The delegate class will be instantiated using init.

principalClassName:看单词意思不难理解,主要类名。如果这个参数是nil,Info.plist中NSPrincipalClass这个键的值(实际在Info.plist中显示为Principal class),如果NSPrincipalClass没有值的话默认UIApplication。principalClassName必须是UIApplication或其子类的名字,它代表着当前iPhone程序本身,这个程序会去读info.plist文件获取配置信息,其中包括主nib文件的值,一般为MainWindow(.xib);

delegateClassName:代理类。尝试在新版中将这个参数置为nil,会发现启动后模拟器一片黑,尝试在AppDelegate中didiFinishLaunchWithOption函数中打断点根本不会停这是为什么呢?为什么之前版本这个参数就是nil呢?

MainWindow.xib文件中遵循UIApplicationDelegate的类的类名,因为UIApplication定义了一个delegte变量,这个变量应该遵循UIApplicationDelegate,负责控制程序的运行,如果主nib文件没有这个类,你应该自定义一个这样的类,并将第四个参数改为这个类的类名,否则这个程序不知道如何进行运作,因为前三个参数代表应用程序本身,它除了把应用的事件循环启动起来,并读取info.plist里的配置信息,不做其它任何事情。如果该参数为nil,则程序假设程序的代理来自Main nib文件。

时间: 2024-11-29 05:18:03

iOS 温故知新之 Main函数和UIApplication的相关文章

iOS程序main函数之前发生了什么

我是前言 一个iOS app的main()函数位于main.m中,这是我们熟知的程序入口.但对objc了解更多之后发现,程序在进入我们的main函数前已经执行了很多代码,比如熟知的+ load方法等.本文将跟随程序执行顺序,刨根问底,从dyld到runtime,看看main函数之前都发生了什么. 从dyld开始 动态链接库 iOS中用到的所有系统framework都是动态链接的,类比成插头和插排,静态链接的代码在编译后的静态链接过程就将插头和插排一个个插好,运行时直接执行二进制文件:而动态链接需

iOS开发——UI精选OC篇&UIApplication,UIWindow,UIViewController,UIView(layer)简单介绍

UIApplication,UIWindow,UIViewController,UIView(layer)简单介绍 一:UIApplication:单例(关于单例后面的文章中会详细介绍,你现在只要知道,单例在应用程序的整个生命周期中只有一个对象). App的启动过程 打开程序之后-> 1:Main函数 2:UIapplicationMain函数 3:初始化UIApplication(创建) 4:设置UIApplication代理和相应的代理属性 5:开启事件循环,监听系统事件 6监测info.p

iOS 从main函数开始

app程序的入口,同样是main函数 main函数为 int main(int argc, char * argv[]),C系语言大多都是这个样子,argc是命令行总的参数个数,argv是参数的数组,值得一提的是argv中第一个参数为app的路径+全名. 然后就是main中的代码 @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } autor

【iOS】被忽略的main函数

如同任何基于C的应用程序,程序启动的主入口点为iOS应用程序的main函数.在iOS应用程序,main函数的作用是很少的.它的主要工作是控制UIKit framework.因此,你在Xcode中创建任何新的项目都配备了一个默认的主函数.除了少数特例外,你永远不应该改变这个函数的实现. 1 #import <UIKit/UIKit.h> 2 3 #import "AppDelegate.h" 4 5 int main(int argc, char * argv[]) 6 {

main函数(本文较老,仅作参考)

Xcode4.2之前的main函数如下: int main(int argc, char *argv[]) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; int retVal = UIApplicationMain(argc, argv, nil, nil); [pool release]; return retVal; } Xcode4.2工程中的主函数为 int main(int argc, char *argv[

(转)被忽略的Main函数

如同任何基于C的应用程序,程序启动的主入口点为iOS应用程序的main函数.在iOS应用程序,main函数的作用是很少的.它的主要工作是控制UIKit framework.因此,你在Xcode中创建任何新的项目都配备了一个默认的主函数.除了少数特例外,你永远不应该改变这个函数的实现. 1 #import <UIKit/UIKit.h> 2 3 #import "AppDelegate.h" 4 5 int main(int argc, char * argv[]) 6 {

第十四周项目4-1:处理C++源代码的程序-查找main()函数

问题及代码: /* *Copyright (c)2015,烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:project.cpp *作 者:陈文青 *完成日期:2015年6月16日 *版 本 号:v1.0 * *问题描述:(1)读入一个C++程序,判断其中是否只有一个main()函数,输出"暂时没有发现问题",或者"没有main()函数",或者"不能定义多个main()函数": 提示1:简单处理,可以只比较判

iOS之项目常见文件、UIApplication详解及UIApplicationDelegate的代理方法

1 一.项目常见文件 2 1.main.m 3 * 里面有一个程序的入口:main函数 4 5 2.Prefix.pch文件 6 * pch文件中的内容 能被 项目中的其他任何文件 共享\包含\访问 7 * 如果定义的内容只用在OC环境中,就必须定义在#ifdef __OBJC__和#endif之间 8 9 3.发布程序的时候自动去除打印语句 10 #ifdef DEBUG 11 #define MyLog(...) NSLog(__VA_ARGS__) 12 #else 13 #define

main 函数argc , argv 主命令行参数

ARGc和ARGv中的ARG指的是"参数"(ARGuments, argument counter 和 argument vector ) 至少有两个参数至主函数:ARGc和ARGv: 首先是一个至算提供的参数到程序, 第二个是对字符串数组的指针. 基本作用: argc, argv 用命令行编译程序时有用. 主函数main中变量(int argc, char *argv[ ])的含义 有些编译器允许将main()的返回类型声明为void,这已不再是合法的C++; main(int ar