[英]NSNotificationCenter Code works in iPhone but not on iPad
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(didEnterBackground:)
name:UIApplicationDidEnterBackgroundNotification
object:nil];
為什么此代碼在iPhone模擬器上卻不能在iPad模擬器上起作用? 我在此代碼上得到EXC_BAD_ACCESS
。 嘗試過iOS 3.2、4.2、4.3版本。
為了擴大對Chiefly 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字符串。 沒有支持多任務並且不提供字符串的設備。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.