这两个main.m有什么区别?

时间:2012-06-08 13:22:10

标签: objective-c ios

我有点困惑,因为我有一个类在其示例代码中使用第一个main.m,而我的项目使用后者。我在使用applicationDidFinishLaunching将类转换为实例时遇到了很多麻烦,我认为这些不同的main.m文件可能是罪魁祸首。我的项目和示例项目之间的.xib文件与主Nib名称的.plist设置相同。代表们都正确链接

#import <UIKit/UIKit.h>
#import "MidiTestingAppDelegate.h"

int main(int argc, char *argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([MidiTestingAppDelegate class]));
    }
}

#import <UIKit/UIKit.h>

int main(int argc, char *argv[])
{
#if __has_feature(objc_arc)
    @autoreleasepool
    {
        int retVal = UIApplicationMain(argc, argv, nil, nil);
        return retVal;
    }
#else
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    int retVal = UIApplicationMain(argc, argv, nil, nil);
    [pool release];
    return retVal;
#endif
}

我假设前者直接进入App Delegate而后者直接加载UIApplication?这是对的吗?

2 个答案:

答案 0 :(得分:4)

这里有很多不好的信息。

首先,假设你有最新版本的Xcode,第一个版本就是你所需要的。

@autoreleasepool语法在非ARC项目中工作。编译器将其全部计算出来并在任何一种情况下生成相应的代码。

第二段代码使用特征检测宏(__has_feature)来决定新的@autoreleasepool语法和遗留NSAutoreleasePool创建池的方法,具体取决于ARC是否为启用。如果您运行的是没有新语法的旧版Xcode,则只需要使用第二段代码。

答案 1 :(得分:0)

第二个例子是糟糕的形式。这是因为@autoreleasepool可以在非ARC项目中使用,实际上比创建自己的池更快(link)。