精品欧美一区二区三区在线观看 _久久久久国色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网站观看| 日本亚洲三级在线| 欧美极品少妇xxxxⅹ裸体艺术 | 亚洲欧洲国产日韩| 国产在线观看一区| 夜夜狠狠擅视频| 日韩一级大片| 久久天堂电影网| 国产全是老熟女太爽了| 日韩精品视频一区二区三区| 日韩欧美aⅴ综合网站发布| 天堂av免费看| 国产爆初菊在线观看免费视频网站| 国产在线麻豆精品观看| 国产精品91在线| 国产精品 欧美 日韩| 久久蜜桃av| 国产午夜一区二区| 影音先锋人妻啪啪av资源网站| 久久亚洲人体| 色激情天天射综合网| 国产精品久久久久久久乖乖| 免费a级在线播放| 久久亚区不卡日本| 国产欧美日韩伦理| 国产高清第一页| 久久爱www久久做| 国产成人精品一区二区三区| 日韩精品一区二区av| 亚洲精品极品少妇16p| 一本色道久久88综合亚洲精品ⅰ| 国内精品免费视频| 无人区乱码一区二区三区| 精品视频一区二区不卡| 国产一区二区视频免费在线观看| 成人国产电影在线观看| 亚洲亚洲人成综合网络| 欧美视频在线第一页| 成人免费在线| 亚洲欧洲精品一区二区精品久久久| 日本电影一区二区三区| 日韩大胆视频| 91网上在线视频| 久久精品国产精品青草色艺| 秋霞网一区二区| 成人激情小说网站| 国产精品一区二区欧美| 亚洲欧美另类综合| 成人丝袜高跟foot| 国产专区一区二区| 日本视频在线观看一区二区三区| www.日韩精品| 久久国产精品久久精品国产| 神马电影在线观看| 成人黄色777网| 久久av免费一区| 欧美成人片在线| 国产日本欧美一区二区| 日韩中文一区| 看女生喷水的网站在线观看| 亚洲女子a中天字幕| 日韩不卡视频一区二区| 日本小视频在线免费观看| 亚洲国产成人av好男人在线观看| 国产夫妻自拍一区| 一区一区三区| 欧美日韩在线一区二区| 波多野结衣网页| 澳门成人av| 亚洲区免费影片| 波多野结衣家庭教师在线观看 | 97精品人妻一区二区三区香蕉| 国内精品视频一区二区三区八戒| 2022国产精品| 日色在线视频| 中文字幕亚洲一区二区va在线| 国产在线无码精品| 日韩深夜视频| 欧美精品久久一区二区三区| 亚洲成人av免费观看| 久久久久久毛片免费看| 国产午夜精品全部视频播放| 曰本女人与公拘交酡| 国产精品嫩草99av在线| 国产精自产拍久久久久久| 亚洲国产精品suv| 国产亚洲欧美在线| 超碰人人爱人人| 日韩免费福利视频| 日韩一级高清毛片| 91激情视频在线观看| 欧美三级午夜理伦三级中文幕| 欧美亚洲视频一区二区| 一级黄色短视频| a级精品国产片在线观看| 午夜一区二区三区| 国产中文在线播放| 在线播放国产精品二区一二区四区| 男男一级淫片免费播放| 日韩在线理论| 欧美在线视频免费观看| 国产偷拍一区二区| 国产区在线观看成人精品| 成人免费网站入口| 日韩成人综合网| 亚洲男人7777| 免费一级肉体全黄毛片| 免费成人av在线播放| 精品无码久久久久久久动漫| 91cn在线观看| 精品视频一区二区三区免费| 国产精品无码一区二区三区免费| 亚洲色图二区| 国产精品自拍小视频| 亚洲欧美一区二区三| 亚洲一区二区三区小说| 午夜精品免费看| 欧洲毛片在线视频免费观看| 97超级碰在线看视频免费在线看| 精品国产av一区二区三区| 中文一区在线播放| 国产成人av影视| 日本午夜精品| 97在线观看视频国产| 亚洲a视频在线| 综合久久久久综合| www.久久91| 成人3d动漫在线观看| 欧美一区二三区| 天堂v在线观看| 一个色妞综合视频在线观看| 91亚洲一区二区| 91成人免费| 国产中文欧美精品| 18免费在线视频| 欧美日韩综合在线免费观看| 公肉吊粗大爽色翁浪妇视频| 日韩av电影免费观看高清完整版| 欧美午夜欧美| 日本在线中文字幕一区二区三区| 亚洲欧美日韩综合| 国产精品传媒在线观看| 国产欧美一区二区精品仙草咪 | 国产福利一区二区三区视频 | 日韩欧美美女一区二区三区| 久久免费看少妇高潮v片特黄| 国产在线视视频有精品| 美女av免费观看| 风间由美一区二区av101| 欧美日韩国产999| 乱精品一区字幕二区| 亚洲国产wwwccc36天堂| jizz日本免费| 日本人妖一区二区| 一区二区视频在线免费| 99re8精品视频在线观看| 久久国产精品亚洲| 内射后入在线观看一区| 欧美日韩一区二区精品| 一级片久久久久| 久久99精品久久久久久动态图 | 欧美激情精品久久| 丁香一区二区三区| 精品一卡二卡三卡| 欧美高清视频手机在在线| 亚洲在线视频福利| brazzers在线观看| 亚洲午夜女主播在线直播| 中文字幕精品一区二区精| 综合久久给合久久狠狠狠97色| 国产999免费视频| 一本久道久久综合婷婷鲸鱼| 欧美亚洲爱爱另类综合| 亚洲一区av| 久久久人成影片一区二区三区观看 | 青青草原av在线| 日韩精品在线看| 在线免费观看高清视频| 亚洲国产精品综合小说图片区| 香蕉视频黄色在线观看| 久久99精品久久久久久国产越南| 精品国产一区二区三区无码| 国产成人黄色| 91麻豆蜜桃| 成人免费福利| 久久久久亚洲精品国产| av福利精品| 精品91自产拍在线观看一区| 亚洲精品久久久久久久蜜桃| 夜夜精品视频一区二区| 天天躁日日躁aaaa视频| 国产精品1区2区| 超碰在线97免费| 亚洲香蕉网站| 亚洲综合激情五月| 亚洲自拍电影| yellow视频在线观看一区二区 | 国产二区三区在线| 亚洲天天在线日亚洲洲精| 亚洲福利在线观看视频| 欧洲生活片亚洲生活在线观看| 国产一级视频在线播放| 国产精品视频在线看| av2014天堂网| 国产成人鲁色资源国产91色综| 欧美精品aaaa| 一区二区91| 成年人视频大全| 99成人超碰| 欧美在线播放一区| 欧美性生活一级片| 成人免费观看网站| 国产日韩欧美中文在线| 国产精品精品一区二区三区午夜版| 97在线视频免费观看完整版| 久久成人在线视频| 最新av网站在线观看| 亚洲欧洲偷拍精品| 香蕉视频成人在线| 亚洲国产精品人久久电影| 国产深喉视频一区二区| 欧美人xxxx| 在线观看日韩一区二区| 精品视频在线免费看| 国产一区二区视频免费| 色哟哟国产精品免费观看| 欧美激情亚洲综合| 图片区小说区国产精品视频 | 欧美系列在线观看| 亚洲不卡视频在线观看| 黑人巨大精品欧美一区二区| 国产无遮无挡120秒| 一二三区精品视频| 久久免费视频播放| 亚洲国产日韩在线一区模特| 免费成年人视频在线观看| 1024精品合集| 成年人二级毛片| 亚洲欧美色一区| 天天鲁一鲁摸一摸爽一爽| 中文字幕一区二区三区色视频| 国产wwwwxxxx| 亚洲日本中文字幕区| 国产一区二区精彩视频| 亚洲精品高清在线观看| 免费一级a毛片夜夜看| 亚洲3atv精品一区二区三区| 日本少妇激情视频| 狠狠久久五月精品中文字幕| 亚洲精品人成| 国产美女免费视频| 在线电影欧美成精品| 国产精品视频无码| 91精品国产入口在线| 国内老熟妇对白xxxxhd| 精品国产一区二区三区久久影院 | 中文字幕一区二区三区最新| 999久久久精品国产| 在线观看三级网站| 亚洲午夜电影| 国产免费一区二区三区视频| 日精品一区二区三区| 手机视频在线观看| 韩国精品一区二区| 稀缺呦国内精品呦| 久久中文娱乐网| frxxee中国xxx麻豆hd| 亚洲精品五月天| 日韩精品视频免费看| 一本到三区不卡视频| 一级做a爱片久久毛片| 欧美成人三级在线| 亚洲欧美日韩综合在线| 中文字幕日韩欧美| 欧美人与牲禽动交com| 欧美最猛性xxxx| 亚洲狼人综合| 精品久久久久久中文字幕动漫 | 欧美 国产 综合| 日韩高清不卡一区二区| 日本在线视频播放| 91丝袜高跟美女视频| 男人的午夜天堂| 午夜精品一区二区三区电影天堂 | 亚洲天堂资源| 成人黄色在线观看| 人妖一区二区三区| 中日韩在线视频| 国产精品久久久久久久免费软件| 亚洲一区日韩精品| 99re这里只有精品视频首页| 成年人免费视频播放| 精品国产91久久久久久老师| 一本大道伊人av久久综合| 亚洲精美色品网站| 国产精品刘玥久久一区| 日本中文字幕成人| 97精品久久| 一区精品视频| 六月天综合网| 一级黄色电影片| 国产精品久久久久三级| 欧美激情黑白配| 日韩欧美高清在线| 在线看的av网站| 日韩美女福利视频| 岛国成人av| 欧美 国产 精品| 久久精品噜噜噜成人av农村| 久久人人爽人人爽人人片| 亚洲综合激情网| 国产精品丝袜黑色高跟鞋| 亚洲少妇激情视频| 九色porny丨首页入口在线| 亚洲永久在线观看| 日韩影院二区| 少妇一级淫免费放| 久久精品综合网| 精品欧美一区二区三区免费观看| 91麻豆精品国产91久久久久久| 电影在线一区| 日韩男女性生活视频| 欧美美女啪啪| 成人国产精品免费观看动漫| 99免费在线观看视频| 久草精品在线| 欧美 日韩 激情| 成人午夜大片免费观看| 日本中文字幕免费在线观看| 欧美日韩亚洲综合在线| 成年人视频网站在线| 日本不卡高字幕在线2019| 亚洲综合影院| 日韩久久久久久久久久久久| 国产一区亚洲一区| 国产第一页浮力| 91 com成人网| 国产在线观看a视频| 91色中文字幕| 亚洲高清资源在线观看| 男生操女生视频在线观看| 国产精品久线在线观看| 国产精品久久久久毛片| 久久精品电影网| 欧美精品影院| www插插插无码免费视频网站| 国产成人av福利| 国产一级中文字幕| 亚洲精品videossex少妇| 国产伦理精品| 欧美午夜精品理论片a级大开眼界| 天堂久久久久va久久久久| 丝袜美腿中文字幕| 欧洲一区在线观看| 黄色在线观看网站| 99久久99久久精品国产片| 激情av一区| 亚洲av无码成人精品国产| 日本韩国视频一区二区| av在线收看| 91情侣在线视频| 99国产精品久久久久久久| 国产精品扒开腿做爽爽| 欧美在线你懂的| 91高清在线观看视频| 国产一区不卡在线观看| 久久最新视频| 欧美一级特黄高清视频| 日韩欧美中文字幕一区| 欧美aa在线| 亚洲精品一区二区三区四区五区| 国内精品免费**视频| 日本少妇性高潮| 亚洲一区二区久久| 人人爱人人干婷婷丁香亚洲| 精品无码一区二区三区在线| 欧美激情综合在线| 亚洲欧美另类视频| 国产精品88a∨| 亚洲天天综合网| 亚洲精品视频在线| 天天综合在线视频| 国产精品视频久久久| 国产精品久久久乱弄| 亚洲精品中文字幕在线播放| 欧美日韩三级一区二区| 欧美亚洲天堂| 色姑娘综合av| 不卡一卡二卡三乱码免费网站| 无码人妻丰满熟妇精品区| 欧美成人精品在线观看| 自拍偷拍欧美一区| 亚洲三级在线视频| 欧日韩精品视频| 国模精品视频| 99精品一区二区三区的区别| 久久久五月婷婷|