为什么不执行以下代码会导致它崩溃?
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 之前的任何版本都应该支持)。
我有一个使用 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 之前的任何版本都应该支持)。