我试图更好地理解基本iOS应用程序中包含的每个文件的目的。
是否有任何理由修改main。m文件?我在想那份文件是否需要被碰一下。如果你要修改它,为什么?
在99.9%的情况下,不需要触摸main.m
。
在另外的0.1%中,您可能希望更改UIApplicationMain()
函数调用的参数。这个函数的最后两个参数指定了代表主应用程序(默认是UIApplication
)和应用程序委托的类的名称。
如果决定创建UIApplication
的子类,可以将第三个参数设置为子类的名称。子类化UIApplication
可以是有用的,如果你想拦截某些事件你的应用程序处理(覆盖sendEvent:
)。
你的应用程序委托类的名称可能会改变,如果你只是决定重命名该类。同样,如果UIApplicationMain()
的第四个参数是nil
(这是在iOS 5中不使用故事板的项目模板中的默认值),它表示你在应用程序的主NIB文件中创建了应用程序委托对象。如果你决定改变这个决定(例如,为一个现有的项目改编故事板),你就必须改变第四个参数,以便告诉UIApplicationMain()
它应该实例化的类的名称。
在某些情况下,您可能需要修改该文件。默认情况下,iOS开发模板假设您将使用Interface Builder来提供初始接口,并且使用nil值作为UIApplicationMain()
的最后一个参数,如下所示:
return UIApplicationMain(argc, argv, nil, nil);
如果您希望以编程方式构造接口,则可能需要使用最后一个参数指定应用程序委托类:
return UIApplicationMain(argc, argv, nil, NSStringFromClass([SPAppDelegate class]));
这样应用程序就知道从哪里开始构造接口。对于使用Interface Builder构建的文件,您可以通过一个Info指示使用哪个IB文件作为基础文件。plist钥匙。
如果你有一个main。你可以使用一个显式的NSAutoreleasePool来包装这个函数:
NSAutoreleasePool *pool = [NSAutoreleasePool new];
int retval = UIApplicationMain(argc, argv, nil, NSStringFromClass([SPAppDelegate class]));
[pool release];
return retval;
在ARC下,这将被转换为@autoreleasepool
:
@autoreleasepool {
int retVal = UIApplicationMain(argc, argv, nil,NSStringFromClass([SPAppDelegate class]));
return retVal;
}
这是仅有的两种情况,我编辑了main。
一般不需要触摸main。m文件。这些都是样板代码。任何初始化通常在你的app委托中完成。