Я отлаживаю, в большой степени утверждают () 'приложение для iPhone редактора (XCode, Objective C ++, и средство моделирования устройства). В некоторых случаях утверждать отказ только завершил бы приложение, вместо того, чтобы ворваться в отладчик, как я буду ожидать.
Я сделал обходное решение путем реализации моего собственного своего рода - утверждают к эффекту:
#define AssertLite(b) if(!(b)) {asm {int 3}}
(опущенный пух), но интересно, встречался ли кто-либо когда-нибудь с этим. Я не мог определить шаблон относительно того, когда делает он повреждается и когда делает он завершается. Код не является поточным; все, что это делает, сделано в обработчиках событий.
Почему это происходит и как я заставляю ваниль утверждать (), ведут себя как условная точка останова, которой это должно быть?
Во-первых, так как вы работаете с приложением для iPhone, вам, вероятно, следует использовать NSAssert() вместо ванильной функции утверждения BSD.
например. NSAssert(the_object, @"NIL object encountered");
Макрос NSAssert бросит исключение Objective-C (NSInternalInconsistencyException
), если утверждение не удастся.
Так как ваша цель - прервать исключение, то следующим шагом будет прервать отладчик Xcode на исключениях Objective-C. В любом случае, это, вероятно, хорошо.
В окне Точки останова (Run->Show->Breakpoints menu item), щелкните там, где написано "Double-Click for Symbol", чтобы ввести символ -[NSException raise]
Последнее, что нужно сделать, это чтобы NSAsserts компилировал а не в релизной сборке. Это означает, что либо вы должны быть готовы к работе с исключением в вашем приложении, либо вы должны создать свой собственный макрос, который компилируется в релизной сборке.
Вот макрос, который я использую для компиляции утверждений в runtime-коде (обратите внимание, что затем я использую HMAssert в своем коде вместо NSAssert):
#ifdef DEBUG
# define HMAssert(A,B) NSAssert(A,B)
#else
# define HMAssert(A,B)
#endif
Это требует определения DEBUG макроса препроцессора. Вот как это настроить: