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