簡體   English   中英

NSNotificationCenter代碼可在iPhone中使用,但不能在iPad上使用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM