有没有理由修改iOS应用程序中的main.m文件?

时间:2011-11-03 16:22:33

标签: objective-c ios cocoa-touch main

我正在尝试更好地了解基本iOS应用程序中包含的每个文件的用途。

有没有理由修改main.m文件?我想知道是否需要触及该文件。如果你做了修改,为什么?

3 个答案:

答案 0 :(得分:17)

在99.9%的案例中,无需触及main.m

在另外0.1%中,您可能希望将调用的参数更改为UIApplicationMain()函数。此函数的最后两个参数指定代表主应用程序的类的名称(默认为UIApplication)和应用程序委托。

如果您决定继承UIApplication,则应将第三个参数设置为子类的名称。如果要拦截应用处理的某些事件(覆盖UIApplication),则子类sendEvent:会很有用。

如果您只是决定重命名该类,则应用委托类的名称可能会更改。此外,如果UIApplicationMain()的第四个参数是nil(这是在iOS 5中不使用Storyboarding的项目模板中的默认参数),则表示您在应用的主NIB中创建了应用委托对象文件。如果您决定更改该决定(例如,为现有项目调整Storyboarding),则必须更改第四个参数,以便告诉UIApplicationMain()它应该实例化的类的名称。

答案 1 :(得分:11)

在某些情况下,您可能需要修改此文件。默认情况下,iOS开发模板假设您将使用Interface Builder来提供初始界面,并且使用nil值作为UIApplicationMain()的最后一个参数来执行此操作,如下所示:

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文件的唯一两种情况。

答案 2 :(得分:0)

通常您不需要触摸main.m文件。这是所有样板代码。任何初始化通常都在您的app委托中完成。