要擴大主要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字符串是在多任務同時引入的。沒有支持多任務處理的設備,並且不提供字符串。
UIApplicationDidEnterBackgroundNotification從4.0開始可用。如果你在iOS 4.0上嘗試過,它肯定會崩潰。你確定你真的在iOS> = 4.0上試過嗎? – robertvojta 2011-03-23 20:12:46
哇。感謝您的澄清。你的確切知識讓我再次檢查......我必須說你是對的。這讓我頗感意外。適用於> = iOS4非常感謝! :D你救了我很多額外的工作:D – folium 2011-03-24 11:16:08