【问题标题】:iOS Application Exception HandlingiOS 应用程序异常处理
【发布时间】:2014-05-04 10:20:03
【问题描述】:

基础知识:使用 XCode(最新版本)、Objective-C/C++ 模块开发的 iOS 应用程序

我有一个可能需要专家帮助的问题...。我的应用程序设计为在 iOS 平台上运行,在所有硬件上,但我碰壁了。该应用程序在所有模拟器上运行良好,在我的 iPod 和 iPad 上,但我的一些测试人员有 iPhone,问题只出现在那个硬件平台上。

基本问题是应用程序似乎在不同的时间点异常终止,有时在使用初期,有时在一个多小时后。我怀疑这可能是内存泄漏或无效调用,只是偶尔会抬起丑陋的脑袋,但我需要找出答案。我已经对应用程序进行了编码,以便在它在“调试”版本中运行时创建一个日志文件,并且我可以将它们部署给拥有 iPhone 的测试人员,但我不能总是访问他们的手机来检索日志文件。

我在应用程序中内置了一个机制来发送屏幕截图的电子邮件,我可以轻松修改它以将日志文件发送给我,但我需要一种方法来触发它。

我的问题:我来自一个基于 MS 的世界,我知道如何从那里的应用程序内部捕获异常,包括添加自动报告问题并在应用程序实际退出之前调用适当方法的内存探测器。有没有办法从应用程序本身内部捕获这些问题并在应用程序结束和所有可用信息丢失之前自动报告这些问题?

另外,如果有某种方法可以以编程方式遍历/转储调用堆栈,将其写入我的日志文件,就像在 XCode 中使用模拟器时模拟器提供的方式一样,并保存该信息,它会有很大的帮助。

谢谢。

p.s.:我知道这不是一个简单的请求,而且响应也很可能不简单,所以提前感谢您的帮助。

【问题讨论】:

  • applicationDidReceiveMemoryWarning?

标签: ios iphone objective-c exception ipod


【解决方案1】:

我已将此代码用于全局级别的异常处理。我遇到了一个问题,即运行应用程序的任何点都会产生异常并且应用程序崩溃,所以我已经实现了应用程序级异常处理。

请参考这个关于堆栈溢出的链接可能对你有用。

How do you implement global iPhone Exception Handling?

在 Appdelegate 类的 applicationDidFixnishLaunchin 方法中写这 NSSetUncaughtExceptionHandler (&uncaughtExceptionHandler) 行代码

    -(BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:  
      (NSDictionary*)launchOptions
     {   
         NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler); 

       EDIT:
         if( [[NSUserDefaults standardUserDefaults] boolForKey:@"isExceptionOccured"])
         {
        //call sever code here
       [[NSUserDefaults standardUserDefaults] setBool:FALSE forKey:@"isExceptionOccured"];
       }
       //rest of your code
      }


       void uncaughtExceptionHandler(NSException *exception)
      {


       NSLog(@"Exception Got %@",[exception description]);
        //do what ever you what here 
     //can save any `bool` so that as aaplication  run on immediate next launching of crash
     //could intimate any thing

    EDIT: 

    [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"isExceptionOccured"];

      }

【讨论】:

  • 谢谢!那太棒了!您是否有任何方法可以将堆栈跟踪扩展为更具可读性的内容,特别是获取堆栈上模块的相关行号?我不介意写代码,我只需要一些方向......
  • @user2893015 再次查看此代码...希望对您有所帮助。
猜你喜欢
  • 2011-05-19
  • 2012-05-01
  • 2015-06-22
  • 2012-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多