Какой надежный способ сделать сбой приложения для iOS?
Я хочу протестировать свое аварийное сообщение о сбое приложения в поле, преднамеренно связав его с сбоем, когда пользователь выполнит конкретное действие, которое реальный пользователь вряд ли сделает случайно.
Но какой хороший надежный способ сделать приложение аварийным, что не создает предупреждение во время компиляции?
Изменить: Обратите внимание, что многие, казалось бы, очевидные ответы на этот вопрос приводят к исключениям, которые попадают под Cocoa и, следовательно, не приводят к сбою приложения.
Ответы
Ответ 1
в Objective-C используйте C напрямую, чтобы вызвать плохой доступ
strcpy(0, "bla");
Примечание: в то время как это работает в любой системе, которую я знаю - в будущей версии среды выполнения C или компиляторе это больше не может привести к сбою. см. Неверное поведение указателя undefined в Objective-C?)
(в быстром случае вам придется перейти на objC, чтобы это сделать)
Ответ 2
Мой текущий любимый:
assert(! "crashing on purpose to test <insert your reason here>");
Классика:
kill( getpid(), SIGABRT );
И некоторые pr0n:
*(long*)0 = 0xB16B00B5;
Все они генерируют сбои, полученные в моем инструменте отчетов о сбоях.
Ответ 3
Поскольку мы все используем Clang для iOS, это достаточно надёжно:
__builtin_trap();
Это имеет то преимущество, что оно предназначено именно для этой цели, поэтому оно не должно генерировать никаких предупреждений или ошибок компилятора.
Ответ 4
abort();
вызывает ненормальное завершение... Это сбой.
Ответ 5
Самый популярный - непризнанная авария селектора:
NSObject *object = [[NSObject alloc] init];
[object performSelector:@selector(asfd)];
Убедитесь, что у вас нет метода -asdf, реализованного в этом классе haha
Или индекс за пределами исключения:
NSArray * array = [NSArray array];
[array objectAtIndex:5];
И, конечно же,
kill( getpid(), SIGABRT );
Ответ 6
Как насчет хорошего старого:)
- (void)stackOverflow
{
[self stackOverflow];
}
Ответ 7
Отправить сообщение освобожденному объекту
Ответ 8
exit(0);
(должен... ввести... 30 символов)
Ответ 9
Я думаю, что в Swift вы можете легко вызвать фатальную ошибку:
func foo() {
fatalError("crash!")
}
На самом деле даже предполагается использовать эту функцию в случае, если что-то пойдет не так, чтобы сделать сбой приложения.
Чтобы избежать оператора if в специальном случае, вы также можете использовать precondition
. Он похож на assert
, таким образом, намерение (если требуется) довольно ясно и не удаляется в финальной версии как assert
. Он используется как precondition(myBoolean, "This is a helpful error message for debugging.")
.
Ответ 10
Вы также можете создать исключение:
[NSException raise:NSInternalInconsistencyException
format:@"I want to test app crashes!."];
Ответ 11
Добавьте распознаватель жестов в представление, которое распознает 10-кратный отвод (5 пальцев для iPhone, так как 10 могут немного переполняться). GR имеет прикрепленный к нему метод, который выполняет любой из ранее упомянутых верных способов заставить ваше приложение сбой. Большинство пользователей не будут класть 10 пальцев на ваше приложение, поэтому вы можете быть уверены в том, что обычный пользователь случайно вызвал сбой.
Однако вы должны использовать что-то вроде Testflight или просто развертывать его на личных устройствах и тестировать в дикой природе, прежде чем отправлять его Apple. После вынужденного сбоя ваше приложение может отклонить Apple.
Ответ 12
может попробовать что-то вроде
NSArray* crashingArray = [NSArray arrayWithCapacity:1];
[crashingArray release];
должен произойти сбой на EXC_BAD_ACCESS (возможно, потребуется отпустить его второй раз, но нормальн он должен сработать как это уже)
Ответ 13
Пойду с: int raise(int sig);
Чтобы получить дополнительную информацию >man raise
Ответ 14
Я бы просто убил процесс нормально:
kill(getpid(), SIGKILL);
Поэтому, если вы устанавливаете обработчик с сигналом, вы также можете справиться с сбоем, заканчивая записью открытых файлов и этих вещей.
Ответ 15
Я использую
[self doesNotRecognizeSelector:_cmd];
Ответ 16
При работе с RubyMotion я использую это:
n=Pointer.new ('c', 1)
n[1000] ='h'
Ответ 17
Попробуйте следующее:
- (IBAction)Button:(id)sender
{
NSArray *array = [NSArray new];
NSLog(@"%@",[array objectAtIndex:8]);
}
Ответ 18
неверный оператор NSLog
сделает это
NSLog(@"%@",1);