2015-04-30 55 views
-1

我有一個使用Admob的應用程序。但由於我支持的iOS 5及以上版本,我要確保我不通過執行以下稱AdMob聯播代碼版本以下的iOS 6:爲什麼不執行下面的代碼會導致它崩潰?

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」);

我猜它在註釋掉時不會崩潰,因爲編譯器會因爲未使用而「優化」代碼。但是,確保代碼沒有被使用並且應用程序不會崩潰的正確方法是什麼?

編輯:我編輯的代碼,如果該塊沒有被優化的:

 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」,所以在其他塊執行的代碼。所以即使認爲函數調用[GADRequest sdkVersion]沒有被創建,它爲什麼會崩潰?同樣,如果我註釋掉函數調用,應用程序不會崩潰。

+0

你有一個堆棧跟蹤?您是否嘗試在所有Objective-C異常中設置斷點,以防異常?它在控制檯崩潰時是否會打印任何有用的信息? – newacct

回答

1

與您所描述的一致的一種可能性是鏈接到AdMob導致崩潰。在代碼中向GADRequest類發送消息會使其鏈接到GADRequest類,而如果沒有,則不會鏈接到該類。

爲什麼鏈接到AdMob會導致崩潰?很可能是因爲AdMob鏈接到多個系統框架,其中一些可能不存在於iOS 5上(例如AdSupport框架),所以當它嘗試在應用程序啓動時動態鏈接到它們時,動態鏈接程序會崩潰。

我不確定你能做什麼。也許您可以嘗試明確鏈接到AdMob在Xcode中用作「可選」的系統框架? (我還沒有測試過。)

否則,您可以降級爲支持iOS 5的AdMob版本(根據release notes,之前的版本應爲7)。

+0

我確實將框架設置爲可選。但它仍然崩潰。但是,你知道admob的早期版本是否仍然會被支持嗎? –

-4

我不知道它爲什麼崩潰 - 但不支持iOS 5.這是毫無意義的。 iOS市場分割大概是iOS7的20%,iOS8的80%。您無法購買iOS5手機,並且無法安裝或甚至無法發佈應用程序。

+0

它在哪裏說你不能爲它發佈應用程序? –

+0

https://developer.apple.com/news/?id=12172014b –

+0

https://developer.apple.com/support/appstore/ –

相關問題