什么是导致 iOS 应用程序崩溃的可靠方法?

我想在现场测试我的应用程序的崩溃报告,通过故意让它崩溃时,用户执行一个特定的行动,一个真正的用户不太可能意外。

但是什么是一个好的可靠的方法,使应用程序崩溃,不创建一个警告在编译时?

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

32311 次浏览

向释放的对象发送消息

您还可以引发一个异常:

[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 );

我目前最喜欢的:

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

经典之作:

kill( getpid(), SIGABRT );

还有一些:

*(long*)0 = 0xB16B00B5;

它们都会生成我的崩溃报告工具捕捉到的崩溃。

可以试试

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

应该崩溃的 EXC _ BAD _ ACCESS (可能需要释放它的第二次,但正常情况下,它应该像这样已经崩溃)

我选 int raise(int sig);

获取更多信息

abort();导致异常终止... 这是一个崩溃。

因为我们都在 iOS 上使用 Clang,所以这是相当可靠的:

__builtin_trap();

这样做的好处是,它正是为此目的而设计的,因此它不应该生成任何编译器警告或错误。

添加一个手势识别器到一个可以识别10个手指的视图中(5个手指代表10个手指可能会有点拥挤)。GR 有一个附加的方法,它可以执行前面提到的任何一种肯定会让你的应用程序崩溃的方法。大多数用户不会对你的应用伸出10根手指,所以你是安全的,免于一般用户意外导致的崩溃。

然而,在提交给苹果之前,你应该能够使用像 TestFlight 这样的东西,或者只是将它部署到个人设备上,在野外进行测试。强制崩溃可能会导致你的应用被苹果拒绝。

exit(0);

(必须... 打... 30个字符)

我会正常地终止这个过程:

kill(getpid(), SIGKILL);

因此,如果你安装一个处理程序与信号,你也可以处理崩溃,完成写打开的文件和这些事情。

一个错误的 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.")一样被使用。

在使用 RubyMotion 时,我使用以下方法:

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

试试这个:

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