【发布时间】:2011-12-21 08:25:52
【问题描述】:
我试图更好地理解基本 iOS 应用程序中包含的每个文件的用途。
是否有任何理由修改 main.m 文件?我想知道是否需要触摸该文件。如果你修改它,为什么?
【问题讨论】:
-
非常明确的问题。欢迎使用 Stack Overflow!
标签: objective-c ios cocoa-touch main
我试图更好地理解基本 iOS 应用程序中包含的每个文件的用途。
是否有任何理由修改 main.m 文件?我想知道是否需要触摸该文件。如果你修改它,为什么?
【问题讨论】:
标签: objective-c ios cocoa-touch main
一般情况下你不需要接触 main.m 文件。这都是样板代码。任何初始化通常在您的应用程序委托中完成。
【讨论】:
在 99.9% 的情况下,不需要触摸 main.m。
在另外 0.1% 中,您可能希望将调用的参数更改为 UIApplicationMain() 函数。此函数的最后两个参数指定代表您的主应用程序(默认为UIApplication)和应用程序委托的类的名称。
如果您决定子类化UIApplication,您可以将第三个参数设置为子类的名称。如果您想拦截您的应用程序处理的某些事件(覆盖 sendEvent:),则子类化 UIApplication 会很有用。
如果您只是决定重命名该类,您的应用委托类的名称可能会更改。此外,如果UIApplicationMain() 的第四个参数是nil(这是在iOS 5 中不使用Storyboard 的项目模板中的默认值),则表示您在应用程序的主NIB 文件中创建了应用程序委托对象。如果您决定更改该决定(例如,为现有项目调整 Storyboard),则必须更改第四个参数,以便告诉 UIApplicationMain() 它应该实例化的类的名称。
【讨论】:
在某些情况下,您可能需要修改此文件。默认情况下,iOS 开发模板假定您将使用 Interface Builder 来提供初始界面,并在 UIApplicationMain() 的最后一个参数存在 nil 值的情况下这样做,如下所示:
return UIApplicationMain(argc, argv, nil, nil);
如果您希望以编程方式构建您的界面,您可能需要使用最后一个参数指定您的应用程序委托类:
return UIApplicationMain(argc, argv, nil, NSStringFromClass([SPAppDelegate class]));
这是为了让应用程序知道从哪里开始构建您的界面。通过使用 Interface Builder 构建的一个,您可以通过 Info.plist 键之一指示要使用哪个 IB 文件作为基础。
如果你有一个在自动引用计数之前创建的 main.m 文件,你可能有一个显式的 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.m 文件的仅有的两种情况。
【讨论】: