2011-03-23 113 views
0
[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(didEnterBackground:) 
             name:UIApplicationDidEnterBackgroundNotification 
             object:nil]; 

爲什麼此代碼可以在iPhone模擬器上運行,但不能在iPad模擬器上運行?我在此代碼上獲得EXC_BAD_ACCESS。嘗試版本的iOS 3.2,4.2,4.3。NSNotificationCenter代碼適用於iPhone,但不適用於iPad

+1

UIApplicationDidEnterBackgroundNotification從4.0開始可用。如果你在iOS 4.0上嘗試過,它肯定會崩潰。你確定你真的在iOS> = 4.0上試過嗎? – robertvojta 2011-03-23 20:12:46

+0

哇。感謝您的澄清。你的確切知識讓我再次檢查......我必須說你是對的。這讓我頗感意外。適用於> = iOS4非常感謝! :D你救了我很多額外的工作:D – folium 2011-03-24 11:16:08

回答

-1

要擴大主要Izzy的評論,UIApplicationDidEnterBackgroundNotification被定義爲extern NSString *。這往往是最好的定義常量字符串的方式,而不是:

#define UIApplicationDidEnterBackgroundNotification @"whatever" 

,因爲它允許您的身份,而不是平等的測試,因爲所有的嘗試都被用戶指UIApplicationDidEnterBackgroundNotification時將會指向同一個實例它不只是(可能受編譯器命令的影響)以相同的值分隔NSString。

UIApplicationDidEnterBackgroundNotification的實際值包含在UIKit中,所以當UIKit庫被加載時,指針將被填充。問題是iOS 3.2沒有定義UIApplicationDidEnterBackgroundNotification,所以最終得到的是一個未定義的指針。因此,您將一個未定義的指針傳遞給NSNotificationCenter,當它嘗試讀取它時會導致崩潰。

的聰明的做法可能是:

UIDevice *currentDevice = [UIDevice currentDevice]; 

if([currentDevice respondsToSelector:@selector(isMultitaskingSupported)] && 
    [currentDevice isMultitaskingSupported]) 
{ 
    [[NSNotificationCenter defaultCenter] addObserver:self 
           selector:@selector(didEnterBackground:) 
           name:UIApplicationDidEnterBackgroundNotification 
           object:nil]; 
} 

所以,你檢查的UIDevice類此設備上的版本是否知道多任務處理甚至是一個可能性,如果是的話是否多任務支持。標準C快捷方式評估意味着只有在成功之前的事情纔會被評估,所以不會意外地發出無法識別的方法調用。

僅當支持多任務時纔會註冊通知。這將是安全的,因爲UIApplicationDidEnterBackgroundNotification字符串是在多任務同時引入的。沒有支持多任務處理的設備,並且不提供字符串。

+0

謝謝。目前我的部署目標已設置爲iOS3。也許我可以將它設置爲iOS4?任何建議?否則,我必須按照您的建議,根據您的建議更改代碼。非常非常感謝你。 – folium 2011-03-24 11:17:59

+0

如果您將部署目標設置爲iOS4,那麼您應該沒有檢查它是否存在就可以使用UIApplicationDidEnterBackgroundNotification。根據API,你仍然可能永遠不會收到它,因爲iOS 4不應該保證多任務可用,但如果你只是針對iPad,我不認爲這是一個問題。我傾向於捕獲UIApplicationWillTerminateNotification並捕獲UIApplicationDidEnterBackgroundNotification(如果可用),通過確保內存中的所有內容安全地存儲到磁盤來響應這兩者。 – Tommy 2011-03-24 12:54:20

+1

您也可以檢查常量的地址是否爲nil('if(&UIApplicationDidEnterBackgroundNotification!= nil){...}') – greg 2011-03-26 00:05:36

相關問題