2013-05-15 3 views
0

В следующем коде NSError конкретизирует (матч GKMatch GAMECENTER в):NSError странный вопрос - приложение падает при попытке получить доступ к свойствам NSError в

... 
    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? Я мог видеть поля для Error в отладчике (те расширяемые данные), как:

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

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

+1

try 'NSError * error = nil;' – Buntylm

+0

Как вы сами сказали: ваш подход неправильный. Вы должны проверить * возвращаемое значение * метода. Если он возвращает «НЕТ», переменная ошибки будет содержать действительный объект, описывающий проблему. –

+0

Но это не объясняет проблему. – Stan

ответ

7

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

NSError * error = nil; 

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

+0

быстрее, но время такое же, не знаю, кто первый? :) +1 – Buntylm

+0

Ваш комментарий ниже вопроса был быстрее моего ответа :) –

+0

hm Я поставил комментарий, но не ответил, что я тоже добавляю ответ, но вы тоже. Удача – Buntylm

3

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

NSError* error = nil; 
+0

Но это не помогает (однако исправлено EXC_BAD_ACCESS). Я все еще получаю - [NSCFString userInfo (или домен, localizedDescription, code и т. Д.)] Нераспознанный селектор, отправленный экземпляру 0x ... – Stan