我有简单的代码执行,如果崩溃,我想捕获异常,这样应用程序就不会崩溃。
@try {
x = [self try_doMyWork:Param];
} @catch (NSException* e) {
NSLog(@"Exception");
}
虽然这段代码在调试中工作并且捕获异常(这是一个超出数组末尾的简单索引),但它在iPhone上的分布式应用程序中崩溃。
为什么会这样,我如何确保它也适用于分布式应用程序?
答案 0 :(得分:2)
在调试模式下,堆管理器可以在它们之前和之后分配具有缓冲区的对象(称为防护),并用已知值(如0x7F)填充这些防护。它这样做是为了它可以在释放内存时测试这些防护,它可以判断你是否在分配的内存结束之后(或在它开始之前)写入。通过这种方式,它可以告诉您代码有错误(内存涂鸦)。
在发布模式下,它不会创建这些防护,因此当您在分配的内存之外写入时,会发生坏事(如崩溃)。
答案 1 :(得分:2)
未捕获的应用程序级异常只是导致崩溃的原因之一。 BSD信号,如EXC_BAD_ACCESS,也可能导致崩溃 - 并且捕获NSExceptions不会阻止这些。
如果不知道try_doMyWork的详细信息,就不可能说出具体的崩溃是什么,但我认为C层崩溃的最常见原因(不是Objective-C层)是内存管理问题 - 尝试写作或阅读您的应用程序不应访问的内容。最可能的解释是,您在调试中看到的异常与您在分发中看到的错误不同。