1. 程式人生 > >ios 使用執行時規避陣列等越界導致程式崩潰

ios 使用執行時規避陣列等越界導致程式崩潰

#import "NSMutableArray+TonyRuntime.h"
#import <objc/runtime.h>
@implementation NSMutableArray (TonyRuntime)
+(void)load
{
staticdispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
Method sourceMethod1 = class_getInstanceMethod(objc_getClass("__NSArrayM"), @selector(objectAtIndex:));
Method destMethod1 =
class_getInstanceMethod(objc_getClass("__NSArrayM"), @selector(safeObjectAtIndex:));

method_exchangeImplementations(sourceMethod1, destMethod1);

Method sourceMethod2 = class_getInstanceMethod(objc_getClass("__NSArrayM"), @selector(removeObjectAtIndex:));
Method destMethod2 = class_getInstanceMethod(objc_getClass
("__NSArrayM"), @selector(safeRemoveObjectAtIndex:));

method_exchangeImplementations(sourceMethod2, destMethod2);

Method sourceMethod3 = class_getInstanceMethod(objc_getClass("__NSArrayM"), @selector(insertObject:atIndex:));
Method destMethod3 = class_getInstanceMethod(objc_getClass("__NSArrayM"), @selector
(safeInsertObject:atIndex:));

method_exchangeImplementations(sourceMethod3, destMethod3);

Method sourceMethod4 = class_getInstanceMethod(objc_getClass("__NSArrayM"), @selector(replaceObjectAtIndex:withObject:));
Method destMethod4 = class_getInstanceMethod(objc_getClass("__NSArrayM"), @selector(safeReplaceObjectAtIndex:withObject:));

method_exchangeImplementations(sourceMethod4, destMethod4);
    });
}
#pragma mark - 陣列的安全處理
-(instancetype)safeObjectAtIndex:(NSInteger)index
{
if (self.count < (index + 1)) {
NSLog(@"Runtime Warning:index %li out of bound",index);
return nil;
    }

return [selfsafeObjectAtIndex:index];
}
-(void)safeRemoveObjectAtIndex:(NSInteger)index
{
if (self.count <= index) {
NSLog(@"Runtime Warning:index %li out of bound",index);
return;
    }

    [selfsafeRemoveObjectAtIndex:index];
}
-(void)safeInsertObject:(id)object atIndex:(NSInteger)index
{
if (!object) {
NSLog(@"Runtime Warning:insert object can not be nil");
return;
    }

if (self.count < index) {
NSLog(@"Runtime Warning:insert object at index %li out of bound",index);
return;
    }

    [selfsafeInsertObject:object atIndex:index];
}
-(void)safeReplaceObjectAtIndex:(NSInteger)index withObject:(id)object
{
if (index >= self.count) {
NSLog(@"Runtime Warning:index %li out of bound",index);
return;
    }

if (!object) {
NSLog(@"Runtime Warning:object can not be empty");
return;
    }

    [selfsafeReplaceObjectAtIndex:index withObject:object];
}

相關推薦

ios 使用執行規避陣列越界導致程式崩潰

#import "NSMutableArray+TonyRuntime.h"#import <objc/runtime.h>@implementation NSMutableArray (TonyRuntime)+(void)load{staticdispatch_once_t onceToken

趣談iOS執行之方法呼叫原理

導語 訊息轉發 OC的動態語言特性 1動態型別 2動態繫結 3動態載入 導語 一個成熟的計算機語言必然有豐富的體系,複雜的容錯機制,處理邏輯以及判斷邏輯。但這些複雜的邏輯都是圍繞一個主線豐富和展開的,所以在學習計算機語言的時候,先掌握核心

IOS執行傳遞物件或者新增屬性

之前做一個專案時,碰到一個問題,為一個UITableViewCell中的不同按鈕繫結不同的物件,點選按鈕後獲取繫結的相應的物件。目前我所知道的有兩種方式可以實現該需求。1.使用IOS提供的執行時  2.之定義UIButton,為其設定屬性。下面介紹第一種方式: 一、使用執行

iOS執行的用途一 -- 交換方法

前言 執行時的的交換方法也叫黑魔法,在許多的第三方框架都使用了,例如AFN等 步驟 一、獲得兩個需要交換的方法 Method aMethod = class_getClassMeth

iOS執行(runtime)探究一:重要概念

iOS執行時簡介 因為Objc是一門動態語言,所以它總是想辦法把一些決定工作從編譯連線推遲到執行時。也就是說只有編譯器是不夠的,還需要一個執行時系統 (runtime system) 來執行編譯後的程式碼。這就是 Objective-C Runtime 系統存

IOS 執行相關資料

iOS~runtime理解 iOS開發-Runtime詳解(簡書) iOS 呼叫IMP/objc_msgSend詳細說明 新手也看

如何防止後臺執行緒丟擲的異常讓程式崩潰退出

如果你的程式拋了異常,你是怎麼處理的呢?等待程式崩潰退出?還是進行補救? 如果是做 UI 開發,很容易就找到 Dispatcher.UnhandledException 事件,然後在事件中進行補救。如果補救成功,可以設定 e.Handled = true 來阻

將NULL指標賦值給std::string變數導致程式崩潰

如題:如上圖,但是我們還會經常寫這樣的程式碼,例如我的flamingo中有程式碼如下(已經修正):位於queryresult.cpp中如果fields[i].name為NULL的話,程式將崩潰。備忘一下

android StrictMode設定導致程式崩潰

    在andorid開發過程中有時候會用到StrictMode進行相關操作,可以用來幫助開發者發現程式碼中的一些不規範的問題,以達到提升應用響應能力的目的 StrictMode分為以下兩種策略:1

安卓從googlephoto上選擇雲端圖片導致程式崩潰的解決方案

當軟體選擇照片時,如果選擇的是使用googlephoto或google雲備份過,並在本地刪除過的圖片時,程式就會崩潰或圖片是空白 ,報錯原因: IllegalArgumentException:InvalidURI:content://com.google

pthread_kill導致程式崩潰 Segmentation fault

pthread_t thread_id;printf("thread = %d\n",pthread_kill(thread_id,0));上述用法,在未對一個pthread_t執行pthread_create前呼叫pthread_kill,會出現Segmentation f

兩個會導致程式崩潰的注意點

    某次設定網路引數的時候,我用setObject:forKey:設定,發現每次程式執行到網路請求部分就崩潰,當時以為是網路請求完的結果處理不當導致的。經過斷點發現每次執行到setObject:forKey:的時候就崩潰。於是發現自己平常使用setObject:forKey:和setValue:forK

程式碼混淆導致程式崩潰原因分析

程式碼混淆是一種專案加密的方法,混淆後的類和方法會重新命名成a.a.b.c的形式,從而防止反編譯破解程式碼。 如果程式碼中使用了反射或者呼叫了JNI等底層程式碼,程式碼混淆會導致程式崩潰, 例如使用JSONObject.toJavaObject()方法將json轉化為物件時

上萬行程式碼級專案開發中快速定位導致程式崩潰的bug的方法

一個專案在開發除錯階段,已經有上萬行程式碼了,但是過程中往往會遇到讓人頭痛的bug,程式莫名其妙的奔潰了,bug在哪裡呢? [NSNull length]: unrecognized select

WriteFile導致程式崩潰的問題

原文:http://www.cnblogs.com/chenkunyun/archive/2012/04/18/2454921.html 在win10上,用vs2010編譯的程式,有一個writefile,在win10上執行沒問題,到了win7上,不論32位 還是64位都

iOS runtime執行特性解決陣列越界問題。

 @interface NSObject (Exchange) -(void)swizzleMethod:(SEL)OldSel withNewMethod:(SEL)NewSel;  @end#import   "NSObject+Exchange.h" @implem

陣列越界導致執行崩潰(列舉作為陣列中的常量)

這個bug的出現也是莫名其妙的,在除錯狀態下不會出現崩潰情況,單獨啟動exe立馬崩潰。而且返回的錯誤是在ntdll.dll中,壓根看不出開哪裡出錯! ////////////////////////////////////////////////////////////

Hibernate 註解序列生成主鍵執行完select seq_t_user.nextval後不執行insert語句導致 執行save()或update()方法無效

hiberna 不能 nal 自動提交 ext 無效 pen mave ransac 題主解決方法: 1)在DAO中獲取session的時候采用sessionFactory.getCurrentSession();不用

iOS-APP-執行防Crash工具XXShield練就

原文地址 前言 正在執行的 APP 突然 Crash,是一件令人不爽的事,會流失使用者,影響公司發展,所以 APP 執行時擁有防 Crash 功能能有效降低 Crash 率,提升 APP 穩定性。但是有時候 APP Crash 是應有的表現,我們不讓 APPCrash 可能會導致別的邏輯錯誤

Xcode開發ios專案遇到自定義執行屬性異常

異常包含以下字樣: this class is not key value coding-compliant for the key 原因: 添加了使用者定義的執行時屬性,去檢查一下, 點選報錯對應的控制元件,然後看一下,不需要的刪除,如果是空名稱的更要刪除,例如下圖: