什么是可靠的方式来使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);