NSNotificationCenter Code работает на iPhone, но не на iPad - PullRequest
0 голосов
/ 23 марта 2011
[[NSNotificationCenter defaultCenter] addObserver:self 
                                      selector:@selector(didEnterBackground:)
                                      name:UIApplicationDidEnterBackgroundNotification
                                      object:nil];

Почему этот код работает на симуляторе iPhone, но не на симуляторе iPad?Я получаю EXC_BAD_ACCESS по этому коду.Пробная версия iOS 3.2, 4.2, 4.3.

1 Ответ

0 голосов
/ 24 марта 2011

Чтобы расширить комментарий Chiefly Izzy, UIApplicationDidEnterBackgroundNotification определяется как extern NSString *.Часто предпочтительнее определять константные строки таким образом, а не как:

#define UIApplicationDidEnterBackgroundNotification @"whatever"

Поскольку это позволяет вам проверять идентичность, а не равенство, потому что все попытки пользователя ссылаться на UIApplicationDidEnterBackgroundNotification будут относиться к одному и тому жеего экземпляр, а не только (возможно, подчиняющийся указу компилятора) отдельные строки NSStrings с одинаковым значением.

Фактическое значение для 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 была введена одновременно с многозадачностью.Не существует устройства, которое поддерживает многозадачность и не предоставляет строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...