EXEC_BAD_ACCESS для applicationWillEnterForeground в iOS3, но не в iOS4 - PullRequest
1 голос
/ 10 августа 2011

У меня отлично работает приложение на iOS 4.3.3 iPhone 3GS. Когда я тестирую приложение на iPhone * 3.1.3 , программа вылетает сразу после появления заставки. Отладчик указывает на последнюю команду моего контроллера корневого представления 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, о котором я должен знать, что помогло бы мне обойти эту проблему?

Ответы [ 2 ]

5 голосов
/ 10 августа 2011

Из библиотеки iOS Developer:

UIApplicationWillEnterForegroundNotification

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

Доступность

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

Возможно, это вызывает EXEC_BAD_ACCESS.Сбой при удалении этой строки кода?

3 голосов
/ 10 августа 2011

Проблема в том, что идентификатор 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];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...