SIGSEGV буквально означает, что вы получаете доступ к адресу, который вам не принадлежит.Так что вы не обязательно обращаетесь к освобожденному объекту;вы можете получить доступ к объекту, который никогда не существовал, например:
UIView *view; // uninitialised, could point to anything
[view setFrame:someFrame];
или даже просто сделать ошибку в не-объектных объектах уровня C, таких как:
int array[100];
array[1000] = 23; // out-of-bounds access
SIGBUSочень похож на SIGSEGV, разница заключается в аппаратном уровне (обычно разница между попыткой получить доступ к адресу, который существует, но у вас нет, и попыткой получить доступ к адресу, который не имеет ничего за этим, но этоне строгое определение), но обычно ассоциируется с ошибками такого же типа, хотя SIGBUS с большей вероятностью будет связан с неинициализированной переменной, чем SIGSEGV.
Если вы пытаетесь отобразить наошибки, которые вы, вероятно, допустили в Objective-C, вы, вероятно, просто хотите прочитать SIGSEGV и SIGBUS вместе, что означает «доступ к памяти, который я не имел права делать».
SIGABRT - программа, пытающаяся прервать себя, поэтому обычно это означает, что какая-то внутренняя проверка согласованности не удалась.Например, SIGABRT вызывается, если вы пытаетесь освободить одну и ту же память дважды, или - на уровне Какао - если вы raise
и NSException
не пойманы.Если вы получаете SIGABRT, вы сделали что-то не так, что обнаруживается системным программным обеспечением (в отличие от SEGV и BUS, которые возникают в аппаратном обеспечении).
SIGTRAP - это вызов программы из отладчика,Как ни странно, Apple, кажется, использует их, когда вы делаете что-то неправильно, что может быть обнаружено в программном обеспечении, но связано с окружающей средой, а не с вашим конкретным кодом.Так, например, вы вызываете функцию C, которая существует в SDK, который вы создали, но не на устройстве, на котором вы работаете (например, когда вы используете последний SDK с более низкой целью развертывания), или делаете то же самое собъект.