【问题标题】:What is the difference between these two main.m?这两个main.m有什么区别?
【发布时间】:2012-06-12 13:31:43
【问题描述】:

我有点困惑,因为我有一个类在其示例代码中使用第一个 main.m,而我的项目使用后者。我在使用 applicationDidFinishLaunching 将类实例化时遇到了很多麻烦,我认为这些不同的 main.m 文件可能是罪魁祸首。我的项目和示例项目之间的 .xib 文件与 Main 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?对吗?

【问题讨论】:

  • 第二个有两个编译时分支:实际编译哪个取决于ARC是否启用。
  • 我希望这样的检查不会分散在整个项目中......
  • Arc 检查分散在我下载的整个课程中。这会有问题吗?
  • 对,我看到有两个分支 - 一个用于 Arc,一个没有。我想知道他们加载的内容有何不同,因为一个使用委托而另一个不使用委托。我的困惑是因为委托在两个项目 NIB 中的设置完全相同。但仅加载示例代码(检查 Arc 的代码)。我想我的问题是,除了检查 ARC 之外,这两个 main.m 做什么不同。
  • 问题是,即使在非 ARC 项目中,您仍然可以使用新的 @autorelease 池语法,只要您有最新的 Xcode 版本。编译器算出来了。

标签: objective-c ios


【解决方案1】:

这里有很多不好的信息。

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

@autoreleasepool 语法在非 ARC 项目中工作。编译器会计算出这一切,并会在任何一种情况下生成适当的代码。

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

【讨论】:

  • +1,为什么这不是公认的答案?无论如何,他确实确实抄袭了这件事。
【解决方案2】:

第二个例子是错误的形式。这是因为@autoreleasepool 可用于非 ARC 项目,而且实际上比创建自己的池更快 (link)。

【讨论】:

    猜你喜欢
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-07
    • 2020-10-10
    相关资源
    最近更新 更多