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

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。