Странная проблема с NSError — приложение аварийно завершает работу при попытке доступа к свойствам NSError

В следующем коде создается экземпляр NSError (соответствует GKMatch от GameCenter):

    ...
    NSString * deviceID = appDelegate.deviceID;
    MessageWithDeviceID message;
    message.message.messageType = kMessageTypeDeviceID;
    const char* const deviceIDAsUTF8 = deviceID.UTF8String;
    for (size_t idx=0;idx<32;idx++)
        message.deviceID[idx] = deviceIDAsUTF8[idx];

    NSData *data = [NSData dataWithBytes:&message length:sizeof(message)];
    NSError * error;
    [match sendDataToAllPlayers:data withDataMode:GKMatchSendDataReliable error:&error];

    data  = nil;
    if (error) 
    NSLog(@"An error is occured: %@",error);
    ...

но приложение вылетает на последней показанной строке с EXC_BAD_ACCESS или SIGABRT -[NSCFString userInfo (or domain, localizedDescription, code etc)] unrecognized selector sent to instance 0x.... Итак, я вижу, что ошибка не равна нулю, и это созданный объект, но я не могу получить от него никакой информации. Я попытался получить следующее:

[error localizedDescription];
[error domain];
[error code];
[error description];
etc.

но приложение все еще падает на строке NSLog независимо от того, какую информацию я пытаюсь получить. Я знаю, что подход неправильный, и мне нужно использовать переменную BOOL в строке, которая отправляет данные, но это не вопрос. Вопрос в том, что не так с объектом NSError? Я мог видеть поля ошибок в отладчике (эту расширяемую информацию), например:

NSObject       NSObject
void *         _reserved
NSInteger      _code        875902004  Summary
NSString *     _domain
NSDictionary * _userInfo

Итак, кажется, что у объекта ошибки есть вся информация, но она недоступна... Почему это так? Является ли NSError каким-то образом не полностью/полностью созданным или что-то в этом роде?


person Stan    schedule 15.05.2013    source источник
comment
попробуй NSError* error = nil;   -  person Buntylm    schedule 15.05.2013
comment
Как вы сами сказали: ваш подход неверен. Вы должны проверить возвращаемое значение метода. Если он возвращает NO, переменная ошибки будет содержать допустимый объект, описывающий проблему.   -  person Martin R    schedule 15.05.2013
comment
Но это не объясняет проблему.   -  person Stan    schedule 15.05.2013


Ответы (2)


Попробуйте инициализировать указатель ошибки на ноль

NSError * error = nil;

Вы получаете сбой, потому что ошибки не было, а ваш указатель содержит случайный адрес.

person Marcin Kuptel    schedule 15.05.2013
comment
быстрее, но время такое же, не знаю, кто первый? :) +1 - person Buntylm; 15.05.2013
comment
Ваш комментарий под вопросом был быстрее, чем мой ответ :) - person Marcin Kuptel; 15.05.2013
comment
хм, я оставил комментарий, но нет ответа, я тоже добавляю ответ, но есть и ты. удачи - person Buntylm; 15.05.2013
comment
Но это не помогает (однако EXC_BAD_ACCESS исправлен). Я все еще получаю -[NSCFString userInfo (или домен, локализованное описание, код и т. д.)] нераспознанный селектор, отправленный экземпляру 0x... например, ошибка не является экземпляром NSError. - person Stan; 15.05.2013
comment
Похоже, ваш указатель указывает на экземпляр NSString. Манипулируете указателем ошибки каким-либо другим способом? - person Marcin Kuptel; 15.05.2013
comment
Возможно, вам следует отладить свой код и посмотреть, когда указатель ошибки изменится с nil на другое значение. - person Marcin Kuptel; 15.05.2013
comment
на самом деле нечего отлаживать, потому что указатель ошибки изменяется в одной-единственной строке: [match sendDataToAllPlayers:data withDataMode:GKMatchSendDataReliable error:&error]. - person Stan; 15.05.2013

Замените эту строку.

NSError* error = nil;
person Buntylm    schedule 15.05.2013
comment
Но это не помогает (однако EXC_BAD_ACCESS исправлен). Я все еще получаю -[NSCFString userInfo (или домен, localizedDescription, код и т. д.)] нераспознанный селектор, отправленный в экземпляр 0x... - person Stan; 15.05.2013