我正在尝试更好地了解基本iOS应用程序中包含的每个文件的用途。
有没有理由修改main.m文件?我想知道是否需要触及该文件。如果你做了修改,为什么?
答案 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委托中完成。