2012-02-25 4 views
5

Я разработал приложение IOS, которая имела:Ошибка NSError *; vs NSError * error = nil;

NSError *error; 

вместо:

NSError *error = nil; 

Он работал хорошо в то время как я отладки в тренажере и отладки на устройстве во время подключения. В тот момент, когда я архивировал его и отправил в TestFlight для развертывания для тестирования, я начал получать Неизвестный сигнал ошибок, возникающих в журнале сбоев.

Почему это происходит?

ответ

7

Это происходит потому, что у вас есть неинициализированный указатель. Он не падает, пока вам повезет, но использование таких указателей - undefined behavior.

+0

@ daSn0wie Если вы сомневаетесь, зарегистрируйте адрес неинициализированной переменной сразу после объявления. 'NSLog (@" error:% p ", error);' – bneely

3

Для уточнения на dasblinkenlights ответить, это объявить переменную:

NSError *error; 

... и это декларирование и назначение переменной

NSError *error = nil; 

Когда вы используете его в первый путь и попытаться для доступа к нему, не устанавливая его ни на что, значение, на которое оно указывает, называется «мусором». Это указатель на другой стек памяти, и доступ к нему почти всегда приведет к сбою приложения. Таким образом, всегда лучше назначить значение вашей переменной, как указано выше, или вскоре после этого.

+1

Не следует обращаться к var 'NSError', если не возникает ошибка, как правило, методом, возвращающим статус ошибки. API не гарантируют значение ошибки var, если нет ошибки. Нельзя полагаться на это только потому, что var был установлен на nil и изменен вызовом, что произошла ошибка. Таким образом, установка его на ноль не наносит вреда и не хороша. – zaph

+0

Это действительно зависит от того, какой API он использует. – coneybeare

+1

Из документов Apple в разделе «NSError»: «В общем, метод должен сигнализировать об ошибке, например, возврату NO или nil, а не простому наличию объекта ошибки». Опора на возвращенный код ошибки всегда будет безопасной, полагаясь на объект 'NSError', может быть или не быть безопасным. Это выбор. – zaph

Смежные вопросы