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

时间:2015-04-30 05:03:20

标签: ios objective-c admob

我有一个使用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,那么应用程序可以正常运行。但如果我取消注释,应用程序几乎立即在主方法中崩溃:

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

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

编辑:我编辑了代码,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],它为什么会崩溃?同样,如果我注释掉函数调用,应用程序不会崩溃。

2 个答案:

答案 0 :(得分:1)

与您所描述的内容一致的一种可能性是,链接到AdMob会导致崩溃。向代码中的GADRequest课程发送消息会导致其链接到GADRequest课程,而如果您没有,则无法链接到该课程。

为什么链接到AdMob导致崩溃?最有可能是因为AdMob链接到多个系统框架,其中一些可能不存在于iOS 5(例如AdSupport框架)上,因此当它尝试在应用启动时动态链接到它们时,动态链接器崩溃。

我不确定你能做什么。也许您可以尝试明确链接到AdMob用作"可选"的系统框架。在Xcode? (我还没有测试过它。)

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

答案 1 :(得分:-4)

我不知道它崩溃的原因 - 但不支持iOS 5.这是毫无意义的。 iOS市场分割类似于iOS7的80%,iOS8的80%。您无法购买iOS5手机,也无法安装或甚至发布应用程序。