如同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文件。