你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> 【iOS】利用runtime處理程序中的常見崩潰

【iOS】利用runtime處理程序中的常見崩潰

編輯:IOS開發綜合

前言

一個已經發布到AppStore上的App,最忌諱的就是崩潰問題。為什麼在開發階段或者測試階段都不會崩潰,而發布到AppStore上就崩潰了呢?究其根源,最主要的原因就是數據的錯亂。特別是 服務器返回數據的錯亂,將嚴重影響到我們的App。


Foundation框架存在許多潛在崩潰的危險

將 nil 插入可變數組中會導致崩潰。數組越界會導致崩潰。根據key給字典某個元素重新賦值時,若key為 nil 會導致崩潰。......

JQSafeKit簡介

這個框架利用runtime技術對一些常用並且容易導致崩潰的方法進行處理,可以有效的防止崩潰。並且打印出具體是哪一行代碼會導致崩潰,讓你快速定位導致崩潰的代碼。你可以獲取到原本導致崩潰的主要信息<由於這個框架的存在,並不會崩潰>,進行相應的處理。比如:你可以將這些崩潰信息發送到自己服務器。你若集成了第三方崩潰日志收集的SDK,比如你用了騰訊的Bugly,你可以上報自定義異常。

下面先來看下防止崩潰的效果吧

可導致崩潰的代碼

 

NSString *nilStr = nil;
    NSArray *array = @[@"HaRi", nilStr];

若沒有JQSafeKit來防止崩潰,則會直接崩潰,如下圖

 

\

若有JQSafeKit來防止崩潰,則不會崩潰,並且會將原本會崩潰情況的詳細信息打印出來,如下圖

\

 

 

Installation【安裝】

From CocoaPods【使用CocoaPods】

pod  “JQSafeKit”

Manually【手動導入】

Drag all source files under floder JQSafeKit to your project.【將JQSafeKit文件夾中的所有源代碼拽入項目中】

使用方法

在AppDelegate的didFinishLaunchingWithOptions方法中添加如下代碼,讓JQSafeKit生效

 

 

//這句代碼會讓JQSafeKit生效,若沒有如下代碼,則JQSafeKit就不起作用
[JQSafeKit becomeEffective];

若你想要獲取崩潰日志的所有詳細信息,只需添加通知的監聽,監聽的通知名為:JQSafeKitNotification

 

     

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    [JQSafeKit becomeEffective];
    
    //監聽通知:JQSafeKitNotification, 獲取JQSafeKit捕獲的崩潰日志的詳細信息
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dealwithCrashMessage:) name:JQSafeKitNotification object:nil];
    return YES;
}

- (void)dealwithCrashMessage:(NSNotification *)note {
//注意:所有的信息都在userInfo中
//你可以在這裡收集相應的崩潰信息進行相應的處理(比如傳到自己服務器)
    NSLog(@"%@",note.userInfo);
}

下面通過打斷點的形式來看下userInfo中的信息結構,看下包含了哪些信息

\

 

userInfo信息結構.png


再看下控制台輸出日志來看下userInfo中的包含了哪些信息\

 

目前可以防止崩潰的方法有


NSArray 1. NSArray的快速創建方式 NSArray *array = @[@"HaRi", @"JQSafeKit"]; //這種創建方式其實調用的是2中的方法

2. +(instancetype)arrayWithObjects:(const id _Nonnull __unsafe_unretained *)objects count:(NSUInteger)cnt

3. - (id)objectAtIndex:(NSUInteger)index


NSMutableArray 1. - (id)objectAtIndex:(NSUInteger)index2. - (void)setObject:(id)obj atIndexedSubscript:(NSUInteger)idx3. - (void)removeObjectAtIndex:(NSUInteger)index4. - (void)insertObject:(id)anObject atIndex:(NSUInteger)index
NSDictionary1. NSDictionary的快速創建方式 NSDictionary *dict = @{@"frameWork" : @"JQSafeKit"}; //這種創建方式其實調用的是2中的方法2. +(instancetype)dictionaryWithObjects:(const id _Nonnull __unsafe_unretained *)objects forKeys:(const id _Nonnull __unsafe_unretained *)keys count:(NSUInteger)cnt
NSMutableDictionary1. - (void)setObject:(id)anObject forKey:(id)aKey2. - (void)removeObjectForKey:(id)aKey
NSString1. - (unichar)characterAtIndex:(NSUInteger)index2. - (NSString *)substringFromIndex:(NSUInteger)from3. - (NSString *)substringToIndex:(NSUInteger)to {4. - (NSString *)substringWithRange:(NSRange)range {5. - (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement6. - (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement options:(NSStringCompareOptions)options range:(NSRange)searchRange7. - (NSString *)stringByReplacingCharactersInRange:(NSRange)range withString:(NSString *)replacement
NSMutableString1. 由於NSMutableString是繼承於NSString,所以這裡和NSString有些同樣的方法就不重復寫了2. - (void)replaceCharactersInRange:(NSRange)range withString:(NSString *)aString3. - (void)insertString:(NSString *)aString atIndex:(NSUInteger)loc4. - (void)deleteCharactersInRange:(NSRange)range
  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved