精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何讓iOS應用從容地崩潰

移動開發 iOS
我知道程序崩潰是大家都不愿意見到的問題,但是既然崩潰已經發生,無法阻擋了,那我們就讓它崩也崩得淡定點吧。

雖然大家都不愿意看到程序崩潰,但可能崩潰是每個應用必須面對的現實,既然崩潰已經發生,無法阻擋了,那我們就讓它崩也崩得淡定點吧。

iOS SDK中提供了一個現成的函數 NSSetUncaughtExceptionHandler 用來做異常處理,但功能非常有限,而引起崩潰的大多數原因如:內存訪問錯誤,重復釋放等錯誤就無能為力了,因為這種錯誤它拋出的是Signal,所以必須 要專門做Signal處理。首先定義一個UncaughtExceptionHandler類,.h頭文件的代碼如下:

  1. #import <UIKit/UIKit.h> 
  2. @interface UncaughtExceptionHandler : NSObject 
  3. BOOL dismissed; 
  4. @end 
  5. void InstallUncaughtExceptionHandler(); 
  6. 然后在.mm文件實現InstallUncaughtExceptionHandler(),如下: 
  7. void InstallUncaughtExceptionHandler() 
  8. signal(SIGABRT, MySignalHandler); 
  9. signal(SIGILL, MySignalHandler); 
  10. signal(SIGSEGV, MySignalHandler); 
  11. signal(SIGFPE, MySignalHandler); 
  12. signal(SIGBUS, MySignalHandler); 
  13. signal(SIGPIPE, MySignalHandler); 

這樣,當應用發生錯誤而產生上述Signal后,就將會進入我們自定義的回調函數MySignalHandler。為了得到崩潰時的現場信息,還可以加入一些獲取CallTrace及設備信息的代碼,.mm文件的完整代碼如下:

  1. #import "UncaughtExceptionHandler.h" 
  2. #include <libkern/OSAtomic.h> 
  3. #include <execinfo.h> 
  4. NSString * const UncaughtExceptionHandlerSignalExceptionName = @"UncaughtExceptionHandlerSignalExceptionName"
  5. NSString * const UncaughtExceptionHandlerSignalKey = @"UncaughtExceptionHandlerSignalKey"
  6. NSString * const UncaughtExceptionHandlerAddressesKey = @"UncaughtExceptionHandlerAddressesKey"
  7. volatile int32_t UncaughtExceptionCount = 0; 
  8. const int32_t UncaughtExceptionMaximum = 10; 
  9. const NSInteger UncaughtExceptionHandlerSkipAddressCount = 4; 
  10. const NSInteger UncaughtExceptionHandlerReportAddressCount = 5; 
  11. @implementation UncaughtExceptionHandler 
  12. + (NSArray *)backtrace 
  13.         void* callstack[128]; 
  14. int frames = backtrace(callstack, 128); 
  15. char **strs = backtrace_symbols(callstack, frames);   
  16. int i; 
  17. NSMutableArray *backtrace = [NSMutableArray arrayWithCapacity:frames]; 
  18. for ( 
  19. i = UncaughtExceptionHandlerSkipAddressCount; 
  20. i < UncaughtExceptionHandlerSkipAddressCount + 
  21. UncaughtExceptionHandlerReportAddressCount; 
  22. i++) 
  23. [backtrace addObject:[NSString stringWithUTF8String:strs[i]]]; 
  24. free(strs);   
  25. return backtrace; 
  26. - (void)alertView:(UIAlertView *)anAlertView clickedButtonAtIndex:(NSInteger)anIndex 
  27. if (anIndex == 0) 
  28. dismissed = YES; 
  29. - (void)handleException:(NSException *)exception 
  30. UIAlertView *alert = 
  31. [[[UIAlertView alloc] 
  32. initWithTitle:NSLocalizedString(@"Unhandled exception", nil) 
  33. message:[NSString stringWithFormat:NSLocalizedString( 
  34. @"You can try to continue but the application may be unstable.\n" 
  35. @"%@\n%@", nil), 
  36. [exception reason], 
  37. [[exception userInfo] objectForKey:UncaughtExceptionHandlerAddressesKey]] 
  38. delegate:self 
  39. cancelButtonTitle:NSLocalizedString(@"Quit", nil) 
  40. otherButtonTitles:NSLocalizedString(@"Continue", nil), nil] 
  41. autorelease]; 
  42. [alert show];    
  43. CFRunLoopRef runLoop = CFRunLoopGetCurrent(); 
  44. CFArrayRef allModes = CFRunLoopCopyAllModes(runLoop);    
  45. while (!dismissed) 
  46. for (NSString *mode in (NSArray *)allModes) 
  47. CFRunLoopRunInMode((CFStringRef)mode, 0.001, false); 
  48. }    
  49. CFRelease(allModes); 
  50. NSSetUncaughtExceptionHandler(NULL); 
  51. signal(SIGABRT, SIG_DFL); 
  52. signal(SIGILL, SIG_DFL); 
  53. signal(SIGSEGV, SIG_DFL); 
  54. signal(SIGFPE, SIG_DFL); 
  55. signal(SIGBUS, SIG_DFL); 
  56. signal(SIGPIPE, SIG_DFL);    
  57. if ([[exception name] isEqual:UncaughtExceptionHandlerSignalExceptionName]) 
  58. kill(getpid(), [[[exception userInfo] objectForKey:UncaughtExceptionHandlerSignalKey] intValue]); 
  59. else 
  60. [exception raise]; 
  61. @end 
  62. NSString* getAppInfo() 
  63.     NSString *appInfo = [NSString stringWithFormat:@"App : %@ %@(%@)\nDevice : %@\nOS Version : %@ %@\nUDID : %@\n"
  64.                           [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleDisplayName"], 
  65.                           [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"], 
  66.                           [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"], 
  67.                           [UIDevice currentDevice].model, 
  68.                           [UIDevice currentDevice].systemName, 
  69.                           [UIDevice currentDevice].systemVersion, 
  70.                           [UIDevice currentDevice].uniqueIdentifier]; 
  71.     NSLog(@"Crash!!!! %@", appInfo); 
  72.     return appInfo; 
  73. void MySignalHandler(int signal) 
  74. int32_t exceptionCount = OSAtomicIncrement32(&UncaughtExceptionCount); 
  75. if (exceptionCount > UncaughtExceptionMaximum) 
  76. return
  77. NSMutableDictionary *userInfo = 
  78. [NSMutableDictionary 
  79. dictionaryWithObject:[NSNumber numberWithInt:signal] 
  80. forKey:UncaughtExceptionHandlerSignalKey]; 
  81. NSArray *callStack = [UncaughtExceptionHandler backtrace]; 
  82. [userInfo 
  83. setObject:callStack 
  84. forKey:UncaughtExceptionHandlerAddressesKey];    
  85. [[[[UncaughtExceptionHandler alloc] init] autorelease] 
  86. performSelectorOnMainThread:@selector(handleException:) 
  87. withObject: 
  88. [NSException 
  89. exceptionWithName:UncaughtExceptionHandlerSignalExceptionName 
  90. reason: 
  91. [NSString stringWithFormat: 
  92. NSLocalizedString(@"Signal %d was raised.\n" 
  93.                                           @"%@", nil), 
  94. signal, getAppInfo()] 
  95. userInfo: 
  96. [NSDictionary 
  97. dictionaryWithObject:[NSNumber numberWithInt:signal] 
  98. forKey:UncaughtExceptionHandlerSignalKey]] 
  99. waitUntilDone:YES]; 
  100. void InstallUncaughtExceptionHandler() 
  101. signal(SIGABRT, MySignalHandler); 
  102. signal(SIGILL, MySignalHandler); 
  103. signal(SIGSEGV, MySignalHandler); 
  104. signal(SIGFPE, MySignalHandler); 
  105. signal(SIGBUS, MySignalHandler); 
  106. signal(SIGPIPE, MySignalHandler); 

在應用自身的 didFinishLaunchingWithOptions 前,加入一個函數:

  1. - (void)installUncaughtExceptionHandler 
  2. InstallUncaughtExceptionHandler(); 

最后,在 didFinishLaunchingWithOptions 中加入這一句代碼就行了:

 

  1. [self InstallUncaughtExceptionHandler]; 

現在,基本上所有崩潰都能Hold住了。崩潰時將會顯示出如下的對話框:

這樣在崩潰時還能從容地彈出對話框,比起閃退來,用戶也不會覺得那么不爽。然后在下次啟動時還可以通過郵件來發送Crash文件到郵箱,這就看各個應用的需求了。

責任編輯:閆佳明 來源: cocoachina
相關推薦

2020-07-08 08:22:08

FlutterSVGPNG

2015-04-08 09:26:21

IT管理云計算基礎設施數據存儲

2019-08-28 07:28:13

React應用程序代碼

2021-01-18 13:17:04

鴻蒙HarmonyOSAPP

2020-11-06 08:13:03

服務器Nodejs客戶端

2021-01-28 14:53:19

PHP編碼開發

2015-12-03 14:33:35

2021-10-28 06:17:46

架構設計組件

2009-11-20 11:52:10

2018-06-20 11:00:06

云應用開發PaaS

2017-11-13 06:35:47

混合云應用程序DevOps

2016-02-29 10:01:59

iosbug合理

2022-07-11 14:53:37

微服務容器IT

2015-02-26 09:19:00

2022-05-11 10:58:11

MetricKitiOS13系統崩潰診斷

2015-06-01 10:48:00

虛擬機云計算云就緒

2014-09-22 15:14:04

2017-04-28 09:04:32

移動應用開發反饋

2024-03-25 13:59:20

機器學習工業應用

2022-07-04 18:58:43

智能合約區塊鏈
點贊
收藏

51CTO技術棧公眾號

天天av综合网| 又色又爽的视频| 草美女在线观看| av不卡在线播放| 国产精品成人观看视频国产奇米| 久久一级免费视频| 成人涩涩网站| 欧美无乱码久久久免费午夜一区| 91传媒免费视频| 欧美日韩国产中文字幕在线| 精品制服美女丁香| 久久久免费观看视频| 亚洲精品国产熟女久久久| 57pao成人永久免费| 午夜精彩视频在线观看不卡| 亚洲二区自拍| 性猛交xxxx乱大交孕妇印度| 久久国产欧美| 欧美国产亚洲视频| 亚洲第一综合网| 成人18夜夜网深夜福利网| 色妞www精品视频| 精品人妻人人做人人爽| av电影在线观看| 99久久精品国产一区| 成人欧美在线观看| 中文字幕在线观看视频免费| 亚洲第一偷拍| 中文字幕精品www乱入免费视频| 中文字幕一区二区三区人妻在线视频 | 精品综合免费视频观看| 日本一区二区在线播放| 久久国产精品二区| 国产韩国精品一区二区三区| 菠萝蜜视频在线观看一区| 日韩一区欧美小说| 欧美二级三级| 午夜在线观看视频18| 国产精品99久久久| 成人黄色免费在线观看| 天天操天天干天天摸| 日韩视频一区| 欧美激情二区三区| 劲爆欧美第一页| 综合视频在线| 久久婷婷国产麻豆91天堂| www.黄色在线| 国产精品欧美在线观看| 日韩电影中文字幕| 黄色av电影网站| 亚洲一区二区免费在线观看| 欧美人xxxx| 三级a三级三级三级a十八发禁止| av日韩亚洲| 欧美性xxxxx| 国产av天堂无码一区二区三区| 日本动漫同人动漫在线观看| 自拍av一区二区三区| 翔田千里亚洲一二三区| 国产女主播在线直播| 国产午夜一区二区三区| 日韩.欧美.亚洲| 国产一级网站视频在线| 欧美激情资源网| 日本在线观看一区| gogogo高清在线观看免费完整版| 欧美国产欧美综合| 图片区小说区区亚洲五月| 高清美女视频一区| 中文字幕精品在线不卡| 亚洲午夜精品久久| 久久99精品久久久久久野外| 专区另类欧美日韩| 黄色一级片国产| 色网在线观看| 天天av天天翘天天综合网 | 99国产精品视频免费观看一公开| 国内精品美女av在线播放| 日韩久久久久久久久| 精品视频第一页| 国产精品毛片久久久| 亚洲精品成人久久| 欧美三级视频网站| 久久精品影视| 久久久久久久久综合| 国产专区第一页| 日本成人在线电影网| 国产伊人精品在线| 国产91免费看| 国产婷婷色一区二区三区| 亚洲欧洲国产日韩精品| 亚洲精品天堂| 欧美午夜精品在线| 国产欧美一区二| 国产一区二区三区不卡av| 亚洲奶大毛多的老太婆| 天天色影综合网| 激情综合在线| 国产精品成人一区二区| 国产99久久九九精品无码免费| 99视频一区二区| 视频一区免费观看| 草美女在线观看| 欧美日韩亚洲高清一区二区| 韩国黄色一级片| 久久激情电影| 国内精品久久影院| 国产又粗又猛又爽又黄91| av网站一区二区三区| 亚洲砖区区免费| 国产色播av在线| 欧美日韩成人一区二区| 岛国精品资源网站| 亚洲国产一区二区在线观看| 日韩美女视频免费看| 亚洲第一色网站| 国产精品网站在线观看| 国产av麻豆mag剧集| 成人国产精品久久| 国产亚洲精品久久久久久777| 国产一级大片在线观看| 美女视频一区二区| 免费久久99精品国产自| 国产丝袜视频在线播放| 这里只有精品视频在线观看| 偷拍夫妻性生活| 亚洲黄色视屏| 99在线影院| 日韩伦理在线观看| 美女扒开腿让男人桶爽久久动漫| 欧美日韩国产首页在线观看| 亚洲午夜福利在线观看| 精品96久久久久久中文字幕无| 国产乱肥老妇国产一区二| 免费播放片a高清在线观看| 亚洲一区二区在线视频| 久久精品国产99久久99久久久| 国产亚洲一卡2卡3卡4卡新区| 欧美国产日韩一区| www.黄色国产| 亚洲美女淫视频| 成人亚洲免费视频| 色综合天天综合网中文字幕| 国产精品久久久久久一区二区 | www亚洲国产| 成人影院在线免费观看| 在线视频中文亚洲| 亚洲欧美一二三区| www久久久久| 久久国产亚洲精品无码| 日韩精品丝袜美腿| 26uuu另类亚洲欧美日本老年| 好吊色视频一区二区| 一区二区在线观看免费| 成年人性生活视频| 欧美日韩一卡| 成人在线观看av| 麻豆蜜桃在线| 亚洲成人黄色网址| 国产成人无码一区二区三区在线| 不卡视频一二三四| 亚洲国产精品无码观看久久| 开心激情综合| 欧美孕妇性xx| xxxxx日韩| 欧美日本一区二区三区四区| 日韩三级久久久| 国产一区二区久久| 欧美国产视频一区| 任你弄精品视频免费观看| 欧美中文在线视频| 成人在线免费电影| 777色狠狠一区二区三区| 国产97免费视频| 成人精品免费看| 国产一区二区视频免费在线观看| 国产一区二区精品久| 国产日韩在线观看av| 97影院秋霞午夜在线观看| 精品欧美黑人一区二区三区| 麻豆一区区三区四区产品精品蜜桃| 亚洲av无码国产精品永久一区 | 欧美日韩在线免费观看视频| 欧美激情三级| 欧美精品成人在线| 牛牛澡牛牛爽一区二区| 欧美性做爰猛烈叫床潮| 欧美黄色免费看| 久久综合久色欧美综合狠狠| 青青草精品视频在线观看| 亚洲深深色噜噜狠狠爱网站| 精品视频高清无人区区二区三区| 桃花岛成人影院| 久久人体大胆视频| 水莓100在线视频| 欧美疯狂性受xxxxx喷水图片| 久草精品视频在线观看| 久久精品亚洲精品国产欧美| 亚洲AV无码久久精品国产一区| 一区二区三区四区五区精品视频 | 超碰在线国产| 精品久久久久久久久久久久久久久久久 | 亚洲一区二区三区在线播放| 人妻av无码一区二区三区| 国产精品小仙女| 黄色一级一级片| 午夜精品偷拍| 日韩av电影免费在线| 亚洲国产中文在线| 国产精品扒开腿爽爽爽视频| 伦理av在线| 色婷婷av一区二区三区久久| 日本人妻丰满熟妇久久久久久| 精品婷婷伊人一区三区三| 日韩免费在线视频观看| 成人免费一区二区三区视频| 日本xxxx裸体xxxx| 国产一区二区三区四区五区入口 | 日韩制服一区| 久久午夜精品| 丁香五月网久久综合| 国产毛片精品久久| 欧美综合第一页| av电影免费在线看| 欧美精品在线免费| 日本在线人成| 一区二区三区日韩在线| 色视频在线观看福利| 亚洲成人教育av| 国内精品久久久久久久久久| 欧美日韩成人综合天天影院| 亚洲av无码乱码国产精品fc2| 精品久久久中文| 国产无套粉嫩白浆内谢| 一区二区三区在线视频播放| 国产乱子轮xxx农村| 久久久国产精华| 中文人妻一区二区三区| 91亚洲国产成人精品一区二区三| 蜜桃视频无码区在线观看| 国产伦精一区二区三区| 亚洲免费黄色录像| 久久精品国产77777蜜臀| 韩国中文字幕av| 蜜桃视频在线观看一区二区| www.国产区| 日产欧产美韩系列久久99| 欧美日韩激情视频在线观看| 国产欧美二区| 免费毛片小视频| 久久精品一区二区三区中文字幕| 女人和拘做爰正片视频| 国产婷婷精品| 国模吧无码一区二区三区| 亚洲免费成人| 国产精品海角社区在线观看| 99re热视频| 欧美熟乱第一页| 一区二区三区免费在线| 4438成人网| 精品毛片在线观看| 精品国产免费一区二区三区四区| 成人免费视频国产免费麻豆| 亚洲国产免费av| 日本私人网站在线观看| 亚洲性视频网站| 婷婷激情在线| 欧美精品在线极品| 精品人人视频| 国产精品成人aaaaa网站| 日韩护士脚交太爽了| 91久久久久久久久久久| 综合成人在线| 久久综合中文色婷婷| 国内精品久久久久久久久电影网| 五月天婷亚洲天综合网鲁鲁鲁| 91偷拍一区二区三区精品| 日本免费黄色小视频| 黄色成人av网站| 北条麻妃在线一区| 精品一区二区三区在线播放| 老司机av网站| 久久久一区二区| 婷婷在线精品视频| 精品成人在线视频| 亚洲综合网av| 精品国产乱码久久久久久闺蜜| 男女污污视频在线观看| 久久亚洲精品一区| 涩涩av在线| 亚洲aa中文字幕| 最新亚洲精品| 色偷偷88欧美精品久久久| 伦理片一区二区| 中文字幕av一区二区三区高 | 性生活一级大片| 91年精品国产| 91日韩中文字幕| 色婷婷综合在线| aaaa一级片| 国产午夜精品免费一区二区三区 | 亚洲精品高清在线观看| 日韩视频在线观看一区| 在线91免费看| 青青草手机在线| 久久99精品久久久久久噜噜 | 在线观看一区二区视频| 亚洲AV无码乱码国产精品牛牛| 亚洲男人天堂手机在线| 性欧美高清come| 国产精品www网站| 欧美变态网站| 欧美中文字幕在线观看视频| 日本强好片久久久久久aaa| 精品久久久久一区二区| 最近日韩中文字幕| 午夜一区二区三区四区| 精品久久久久久无| 日本www在线观看视频| 清纯唯美亚洲综合| 红杏视频成人| 国产精品一二三在线观看| 免费欧美在线视频| 色欲av无码一区二区三区| 亚洲成人激情自拍| av在线亚洲天堂| 日韩视频在线免费| 国产福利亚洲| 日韩欧美在线一区二区| 男女精品网站| 一级欧美一级日韩片| 亚洲综合在线免费观看| 99精品免费观看| 日韩网站免费观看| 另类一区二区| 五月天久久综合网| 秋霞成人午夜伦在线观看| 久久国产柳州莫菁门| 日韩欧美在线观看| 男女污污视频在线观看| 欧美最猛性xxxxx(亚洲精品)| 荡女精品导航| 男女啪啪免费视频网站| 国产成人av一区二区三区在线| 校园春色 亚洲| 日韩欧美美女一区二区三区| 最新黄网在线观看| 2022国产精品| 欧美视频在线观看| 91精品人妻一区二区三区四区| 图片小说视频色综合| 欧美激情视频在线观看| 91久久青草| 玖玖精品在线视频| 国产福利一区二区三区视频| 欧美成人黄色网| 亚洲成avwww人| heyzo高清国产精品| 精品亚洲一区二区三区四区五区高| 亚洲精品日韩久久| 欧美多人猛交狂配| 在线观看亚洲精品| 日本中文字幕在线看| 92裸体在线视频网站| 欧美三区美女| 中文精品在线观看| 欧美视频一区二区在线观看| 91ph在线| 97免费资源站| 国产农村妇女毛片精品久久莱园子 | 欧洲精品视频在线| 国产成人午夜精品影院观看视频| 久久精品欧美一区二区| 日韩精品久久久久| 巨胸喷奶水www久久久免费动漫| 一区二区三区我不卡| 国产精品99精品久久免费| 国产奶水涨喷在线播放| 亚洲欧美成人精品| crdy在线观看欧美| 国产美女主播在线| 国产亚洲精久久久久久| 国产男男gay体育生白袜| 91产国在线观看动作片喷水| 精品国产91久久久久久浪潮蜜月| 亚洲精品综合在线观看| 亚洲综合av网| 春暖花开成人亚洲区| 444亚洲人体| 校园激情久久| 亚洲国产美女视频| 亚洲精品资源在线| 久久久久久久久成人| 欧美色图另类小说| 亚洲特级片在线| 日韩电影在线观看完整版| 91香蕉亚洲精品| 美女国产一区| 免费在线观看国产精品| 国产一区二区三区网站|