NSError EXC_BAD_ACCESS - PullRequest
       20

NSError EXC_BAD_ACCESS

2 голосов
/ 25 октября 2011

Мне нужна вторая пара слов о том, почему я получаю сообщение об ошибке при попытке назначить NSError одному, переданному в функцию:

// Response and Error Objs.
NSURLResponse *response = nil;
NSError *requestError = nil;

// Attempt authentication
[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&requestError];

// Error?
if (requestError != nil) {
    *error = requestError; // Error happens here
    return;
}

Ответы [ 5 ]

1 голос
/ 25 октября 2011

Из Apple Руководство по программированию обработки ошибок

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

В этом случае -sendSynchronousRequest:returnResponse:error: возвращает объект NSData. Прежде чем продолжить с ошибкой, проверьте, не равняется ли это значению.

0 голосов
/ 20 февраля 2015

Допустим, у вас есть подпись метода, которая принимает NSError**.

Это означает, что метод принимает указатель на указатель, указывающий на значение NSError.

Итак, я подозреваю, что ошибка имеет значение NULL, вы в основном спрашиваете объект NULL, каково значение того, на что он указывает.Но, конечно, вы не можете запросить объект NULL для этой информации, поэтому он аварийно завершает работу.

Итак, прежде чем пытаться установить значение *error, вам нужно проверить, что error не NULL примерно так:

if (error == NULL) {
    // the function caller has supplied us with a nil as an argument
    // this indicates the caller does not care about the error
    return;
}

Причина, по которой вы должны проверить NULL вместо nil, заключается в том, что вы проверяете область памяти, а не объект какао.

0 голосов
/ 25 октября 2011

вы не можете использовать 'error' в форме, которую вы пытаетесь использовать.Вы можете получить доступ к ошибке в NSURLConnection, но не за ее пределами.Следовательно, вам нужно определить свой объект ошибки перед его использованием.

0 голосов
/ 25 октября 2011

Скорее всего *error не указывает на действительный указатель; образец не завершен, поэтому я не могу сказать наверняка. Возможно *error - ноль.

0 голосов
/ 25 октября 2011

Вы забыли ошибку NSE:

if (requestError != nil) {
    NSError *error = requestError; // Error happens here
    return;
}

Или где / когда объявлено / определено error и какой смысл назначать один объект ошибки другому?Почему бы просто:

if (requestError != nil) {
    NSLog(@"%@", [requestError localizedDescription]);
    return;
}
...