我想在现场测试我的应用程序的崩溃报告,通过故意让它崩溃时,用户执行一个特定的行动,一个真正的用户不太可能意外。
但是什么是一个好的可靠的方法,使应用程序崩溃,不创建一个警告在编译时?
编辑: 注意,这个问题的许多看似明显的答案会导致异常,这些异常会被 Cocoa 捕获,因此不会导致应用程序崩溃。
向释放的对象发送消息
您还可以引发一个异常:
[NSException raise:NSInternalInconsistencyException format:@"I want to test app crashes!."];
在 Objective-C 中直接使用 C 导致错误访问
strcpy(0, "bla");
注意: 虽然这可以在我所知道的任何系统上工作——在未来版本的 C 运行时或编译器中,这可能不会再导致崩溃。(见 Objective-C 中是否有空指针解引用未定义行为?)
(迅速地,你将不得不桥梁对对象 C 做到这一点)
最受欢迎的选择器崩溃:
NSObject *object = [[NSObject alloc] init]; [object performSelector:@selector(asfd)];
确保你没有在那个类中实现-asdf 方法,哈哈
或索引超越界限的例外情况:
NSArray * array = [NSArray array]; [array objectAtIndex:5];
当然 kill( getpid(), SIGABRT );
kill( getpid(), SIGABRT );
我目前最喜欢的:
assert(! "crashing on purpose to test <insert your reason here>");
经典之作:
还有一些:
*(long*)0 = 0xB16B00B5;
它们都会生成我的崩溃报告工具捕捉到的崩溃。
可以试试
NSArray* crashingArray = [NSArray arrayWithCapacity:1]; [crashingArray release];
应该崩溃的 EXC _ BAD _ ACCESS (可能需要释放它的第二次,但正常情况下,它应该像这样已经崩溃)
我选 int raise(int sig);
int raise(int sig);
获取更多信息
abort();导致异常终止... 这是一个崩溃。
abort();
因为我们都在 iOS 上使用 Clang,所以这是相当可靠的:
__builtin_trap();
这样做的好处是,它正是为此目的而设计的,因此它不应该生成任何编译器警告或错误。
添加一个手势识别器到一个可以识别10个手指的视图中(5个手指代表10个手指可能会有点拥挤)。GR 有一个附加的方法,它可以执行前面提到的任何一种肯定会让你的应用程序崩溃的方法。大多数用户不会对你的应用伸出10根手指,所以你是安全的,免于一般用户意外导致的崩溃。
然而,在提交给苹果之前,你应该能够使用像 TestFlight 这样的东西,或者只是将它部署到个人设备上,在野外进行测试。强制崩溃可能会导致你的应用被苹果拒绝。
exit(0);
(必须... 打... 30个字符)
我会正常地终止这个过程:
kill(getpid(), SIGKILL);
因此,如果你安装一个处理程序与信号,你也可以处理崩溃,完成写打开的文件和这些事情。
一个错误的 NSLog语句就可以了
NSLog
NSLog(@"%@",1);
一个好的旧的堆栈溢出怎么样:)
- (void)stackOverflow { [self stackOverflow]; }
我吸毒
[self doesNotRecognizeSelector:_cmd];
我认为在 Swift 中,你可以轻易地抛出一个致命的错误:
func foo() { fatalError("crash!") }
实际上,它甚至打算在出现问题时使用这个特性,以使应用程序崩溃。
为了避免在特殊情况下使用 if 语句,也可以使用 precondition。它类似于 assert,因此意图(如果需要的话)非常明确,并且在最终版本中作为 assert删除了 没有。它像 precondition(myBoolean, "This is a helpful error message for debugging.")一样被使用。
precondition
assert
precondition(myBoolean, "This is a helpful error message for debugging.")
在使用 RubyMotion 时,我使用以下方法:
n=Pointer.new ('c', 1) n[1000] ='h'
试试这个:
- (IBAction)Button:(id)sender { NSArray *array = [NSArray new]; NSLog(@"%@",[array objectAtIndex:8]); }