什么是可靠的方式来使iOS应用程序崩溃?

我想在用户执行某个特定操作时,故意让应用程序崩溃,从而testing应用的崩溃情况。

但是,在编译时不会产生警告的应用程序崩溃的可靠方法是什么?

编辑:请注意,许多看似明显的答案,这个问题导致exception,被cocoa捕获,因此不会导致应用程序崩溃。

在Objective-C中直接使用C来导致访问不良

 strcpy(0, "bla"); 

注意:虽然这可以在任何我知道的系统上工作 – 在未来版本的C运行时或编译器中,这可能不会导致崩溃。 请参阅Objective-C中的空指针取消引用未定义的行为?

(在迅速,你将不得不桥接objC这样做)

我目前的最爱:

 assert(! "crashing on purpose to test <insert your reason here>"); 

经典:

 kill( getpid(), SIGABRT ); 

还有一些pr0n:

 *(long*)0 = 0xB16B00B5; 

所有这些产生崩溃报告工具捕获的崩溃。

由于我们都使用Clang for iOS,这是相当可靠的:

 __builtin_trap(); 

这样做的好处是它专门用于这个目的,所以它不应该产生任何编译器警告或错误。

abort(); 导致exception终止…这是一个崩溃。

最stream行的一个 – 无法识别的select器崩溃:

 NSObject *object = [[NSObject alloc] init]; [object performSelector:@selector(asfd)]; 

确保你没有在这个类中实现的-asdf方法

或指数超越界限例外:

 NSArray * array = [NSArray array]; [array objectAtIndex:5]; 

当然kill( getpid(), SIGABRT );

怎么样一个好的旧堆栈溢出:)

 - (void)stackOverflow { [self stackOverflow]; } 

将消息发送到释放对象

 exit(0); 

(必须…键入… 30个字符)

我想在Swift中你可以很容易地抛出一个致命的错误:

 func foo() { fatalError("crash!") } 

它实际上甚至打算使用这个function,以防万一出现错误,以使应用程序崩溃。

为了避免特殊情况下的if语句,您也可以使用precondition 。 这与assert类似,因此意图(如果想要的话)非常清晰,并且在最终版本中不会assert一样被删除。 它用于像precondition(myBoolean, "This is a helpful error message for debugging.")

您也可以引发exception:

 [NSException raise:NSInternalInconsistencyException format:@"I want to test app crashes!."]; 

将一个手势识别器添加到识别10个手指点击的视图(对于iPhone 5个手指,因为10可能会有点拥挤)。 GR有一个附加的方法,执行前面提到的任何一种万无一失的方法来让你的应用程序崩溃。 大多数用户不会在您的应用程序中放置10个手指,所以您可以安全地从一般用户意外导致崩溃。

但是,您应该可以使用Testflight之类的东西,或者只是将其部署到个人设备,并在提交给Apple之前进行testing。 有一个强制性的崩溃可能会让你的应用程序拒绝苹果。

可以尝试类似的东西

 NSArray* crashingArray = [NSArray arrayWithCapacity:1]; [crashingArray release]; 

应该在EXC_BAD_ACCESS上崩溃(可能需要再次释放它,但通常情况下它应该已经崩溃了)

我会去: int raise(int sig);

获得更多信息>man raise

我通常会杀死进程:

 kill(getpid(), SIGKILL); 

所以如果你用信号安装一个处理程序,你也可以处理崩溃,完成写入打开的文件和这些东西。

我用

 [self doesNotRecognizeSelector:_cmd]; 

使用RubyMotion时,我使用这个:

  n=Pointer.new ('c', 1) n[1000] ='h' 

尝试这个:

 - (IBAction)Button:(id)sender { NSArray *array = [NSArray new]; NSLog(@"%@",[array objectAtIndex:8]); } 

一个错误的NSLog语句将做到这一点

 NSLog(@"%@",1);