为什么不执行以下代码会导致它崩溃?

Why does not executing the following code cause it to crash?

我有一个使用 Admob 的应用程序。但由于我支持 iOS 5 及更高版本,我确保不会通过执行以下操作在 iOS 6 以下版本中调用 Admob 代码:

   if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_5_1) {
        int j = 2;
        j++; //This is just some code so I can use breakpoints for testing.
        NSLog(@"Google Mobile Ads SDK version: %@", [GADRequest sdkVersion]); //Commenting out the line prevents the crash
    }

我正在 iOS 5.1.1 上进行测试。现在,如果我注释掉 NSLog 行,该应用程序可以正常运行。但是,如果我取消注释,应用程序几乎会立即在 main 方法中崩溃:

int retVal = UIApplicationMain(argc, argv, nil, @"AppController");

我猜它在被注释掉时不会崩溃,因为编译器 "optimises out" 代码因为它没有被使用。但是,确保代码未被使用且应用程序不会崩溃的正确方法是什么?

编辑:我编辑了代码,if 块没有优化:

        int j = 2;

   if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_5_1) {
        j++; //This is just some code so I can use breakpoints for testing.
        NSLog(@"Google Mobile Ads SDK version: %@", [GADRequest sdkVersion]); //Commenting out the line prevents the crash
    }else{
        j--;
    }

    NSLog(@"%d",j);

输出为“1”,所以执行else块中的代码。所以即使认为函数调用 [GADRequest sdkVersion] 没有进行,为什么它会崩溃?同样,如果我注释掉函数调用,应用程序不会崩溃。

我不知道它为什么会崩溃 - 但不支持 iOS 5. 毫无意义。 iOS 市场分割约为 20% iOS7、80% iOS8。您无法购买 iOS5 部手机,也无法为其安装或发布应用程序。

与您所描述的一致的一种可能性是,link访问 AdMob 导致了崩溃。在您的代码中向 GADRequest class 发送消息会导致它 link 到 GADRequest class,而如果您不这样做,它就不会link 到它了。

为什么 link 连接到 AdMob 会导致崩溃?很可能是因为 AdMob links 到几个系统框架,其中一些可能不存在 iOS 5(例如 AdSupport 框架),所以当它尝试动态 link对他们来说,应用程序启动时,动态 linker 崩溃了。

我不确定你能做什么。也许您可以尝试显式 linking 到 AdMob 在 Xcode 中用作 "optional" 的系统框架? (我还没有测试过。)

否则,您可以降级到支持 iOS 5 的 AdMob 版本(根据 release notes,7 之前的任何版本都应该支持)。