EXEC_BAD_ACCESS для applicationWillEnterForeground в iOS3, но не в iOS4

Мое приложение отлично работает на моем iOS 4.3.3 iPhone 3GS. Когда я тестирую приложение на 3.1.3 iPhone 3G, программа аварийно завершает работу сразу после показа заставки. Отладчик указывает на последнюю команду моего корневого контроллера представления awakeFromNib:

- (void)awakeFromNib
{
    NSLog(@"awakeFromNib");
    NSLog(@"applicationWillEnterForeground listened");
    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(applicationWillEnterForeground:)
                                                 name:UIApplicationWillEnterForegroundNotification
                                               object: nil];
}

.

2011-08-09 15:56:24.585 AppName[4401:207] awakeFromNib
2011-08-09 15:56:24.602 AppName[4401:207] applicationWillEnterForeground listened
Program received signal:  “EXC_BAD_ACCESS”.

Есть ли что-то особенное в пробуждении/сне iOS 3, что мне следует знать, что помогло бы мне обойти эту проблему?


person JoJo    schedule 09.08.2011    source источник


Ответы (2)


Проблема в том, что идентификатор UIApplicationWillEnterForegroundNotification указывает на внешне определенную строку, которая существует только в iOS 4 или более поздней версии. В iOS 3 и более ранних версиях он будет равен нулю; таким образом, вы передаете nil для имени уведомления, поэтому добавление наблюдателя приводит к сбою.

Вы можете исправить это двумя способами. Вы можете напрямую использовать строковое значение имени уведомления в своем коде:

[[NSNotificationCenter defaultCenter]
 addObserver:self 
 selector:@selector(applicationWillEnterForeground:)
 name:@"UIApplicationWillEnterForeground" // might not be correct
 object:nil];

Я не уверен, что это так, вам придется проверить документы или использовать NSLog, чтобы быть в этом абсолютно уверенным.

Лучше сначала проверить значение идентификатора и добавить прослушиватель только в том случае, если он поддерживается:

if (UIApplicationWillEnterForegroundNotification) {
    [[NSNotificationCenter defaultCenter]
     addObserver:self 
     selector:@selector(applicationWillEnterForeground:)
     name:UIApplicationWillEnterForegroundNotification
     object:nil];
}
person benzado    schedule 10.08.2011

Из библиотеки разработчика iOS:

UIApplicationWillEnterForegroundNotification

Публикуется незадолго до того, как приложение выходит из фонового состояния на пути к тому, чтобы стать активным приложением. Объектом уведомления является объект UIApplication. Нет словаря userInfo.

Доступность

Доступно в iOS 4.0 и более поздних версиях.

Вероятно, это вызывает ошибку EXEC_BAD_ACCESS. Будет ли он падать, если вы удалите эту строку кода?

person Sascha    schedule 09.08.2011
comment
Удаление строки исправляет это, но как мне смоделировать это событие в iOS 3? Я хочу, чтобы представление таблицы обновлялось каждый раз, когда пользователь открывает приложение. Фейсбук делает это. Он обновляет вашу ленту новостей всякий раз, когда она открыта. - person JoJo; 10.08.2011
comment
Имена уведомлений представляют собой строки, прослушивание неподдерживаемых уведомлений не приведет к сбою вашего приложения, оно просто никогда не получит уведомление. - person benzado; 10.08.2011
comment
Я создал обходной путь, используя вместо этого applicationDidBecomeActive. Мне просто нужно было быть осторожным, различая didBecomeActive и willEnterForeground. Оба запускаются почти в одно и то же время, за исключением того, что willEnterForeground не запускается в первый раз при загрузке приложения. - person JoJo; 10.08.2011