iOS:后台线程异常没有崩溃

前端之家收集整理的这篇文章主要介绍了iOS:后台线程异常没有崩溃前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我没有找到符合我经验的文档.

我想要的是在后台线程中处理Uncaught-Exceptions的好方法.这种“方式”应该让应用程序崩溃,但在崩溃之前执行一些非常基本的操作(例如,将值保存到UserDefaults以便可以在下次启动时检查;以及日志记录).

在主线程上,我只是设置了一个uncaughtExceptionHanlder,这个工作正常.但是,在后台线程上 – 在NSOperationQueue上作为NSOperation执行 – 任何异常都在发生,但没有退出应用程序:崩溃.该应用程序继续以损坏的状态运行.

但是,线程编程指南指出:

Setting Up an Exception Handler If your application catches and
handles exceptions,your thread code should be prepared to catch any
exceptions that might occur. Although it is best to handle exceptions
at the point where they might occur,failure to catch a thrown
exception in a thread causes your application to exit. Installing a
final try/catch in your thread entry routine allows you to catch any
unknown exceptions and provide an appropriate response.

一个工作的方法(下面)是使用try / catch嵌入线程调用方法,如果是异常,则记录然后调用abort().但这不是最好的方法.我想将异常发送到主线程并让它由未捕获的异常处理程序处理.有没有人这样做过?

- (void)threadMethod
{
    @try
    {
        NSArray* aTest = [NSArray array];
        [aTest objectAtIndex:10];
    }
    @catch (NSException* e)
    {
        // Save to state to User Defaults.
        // Log any needed info.

        abort();
    }
    @finally
    {

    }
}

仅供参考:我使用XCode 4.5 SDK在iOS6上运行.

解决方法

> NSOperationQueue运行的线程由libdispatch管理,它​​捕获异常并调用terminate,退出应用程序.如果你看到不同的行为,那你就已经做错了.
>在异常是一个不确定的命题之后将数据保存到NSUserDefaults;因为Cocoa只将异常视为程序员错误,所以一旦被抛出,它就不会试图让自己处于可用状态.简而言之,您应该像处理“真正的”崩溃一样对待它,就好像只有异步信号安全的API可用.任何Objective-C都会在这方面自动退出.
>您的问题表明您正在尝试进行崩溃报告.我建议使用崩溃报告解决方案,例如 PLCrashReporter.还有一些分析和分发服务嵌入崩溃报告,包括 HockeyApp,Crashlytics,TestFlightQuincyKit.还有其他一些,其中一个是适合您,取决于您的需求.所有这些都将处理安全处理崩溃和异常所涉及的所有棘手问题,并保存数据以供日后使用,而无需担心任何问题.

猜你在找的iOS相关文章