iOS runtime執行時特性解決陣列越界問題。
@interface NSObject (Exchange)
-(void)swizzleMethod:(SEL)OldSel withNewMethod:(SEL)NewSel;
@end#import
"NSObject+Exchange.h"
@implementation NSObject (Exchange)
-(void)swizzleMethod:(SEL)OldSel withNewMethod:(SEL)NewSel
{
Class selfclass=[self class];
Method oldMethod=class_getInstanceMethod(selfclass, OldSel);
Method newMethod=class_getInstanceMethod(selfclass, NewSel);
BOOL addselector=class_addMethod(selfclass, OldSel, class_getMethodImplementation(selfclass, NewSel), method_getTypeEncoding(newMethod));
if (addselector) {
NSLog(@"加方法成功");
class_replaceMethod(selfclass, NewSel, class_getMethodImplementation(selfclass, OldSel), method_getTypeEncoding(oldMethod));
}else {
method_exchangeImplementations(oldMethod, newMethod);
} }
#import "NSObject+Exchange.h"
@interface NSArray (CheckIndex)
@end
#import "NSArray+CheckIndex.h"
@implementation NSArray (CheckIndex)
+(void)load{
SEL [email protected](objectAtIndex:);
SEL [email protected](emptycheckObjectAtIndex:);
SEL [email protected](arrayIcheckObjectAtIndex:);
SEL [email protected](arrayMcheckObjectAtIndex:);
[objc_getClass("__NSArray0") swizzleMethod:oldSel withNewMethod:newSel];
[objc_getClass("__NSArrayI") swizzleMethod:oldSel withNewMethod:newSel1];
[objc_getClass("__NSArrayM") swizzleMethod:oldSel withNewMethod:newSel2];
[objc_getClass("__NSSingleObjectArrayI") swizzleMethod:@selector(objectAtIndex:) swizzledSelector:@selector(singleObjectIndex:)];
}
-(id)emptycheckObjectAtIndex:(NSInteger)index{
if (self.count>index) {
return [self emptycheckObjectAtIndex:index]; }else{ return nil;
}
}
-(id)arrayIcheckObjectAtIndex:(NSUInteger)index{
NSLog(@"檢查");
if (self.count>index) { return [self arrayIcheckObjectAtIndex:index];
}else{
return nil;
}}
-(id)arrayMcheckObjectAtIndex:(NSUInteger)index{
NSLog(@"檢查"); if (self.count>index) {
return [self arrayMcheckObjectAtIndex:index];
}else{
return nil;
}
}
-(id)singleObjectIndex:(NSInteger )index
{
if (index >= self.count || index < 0) {
returnnil;
}
return [selfsingleObjectIndex:index];
}
相關推薦
iOS runtime執行時特性解決陣列越界問題。
@interface NSObject (Exchange) -(void)swizzleMethod:(SEL)OldSel withNewMethod:(SEL)NewSel; @end#import "NSObject+Exchange.h" @implem
iOS Runtime 執行時之三:訊息處理機制
前面我們討論了Runtime中對類和物件的處理,及對成員變數與屬性的處理。這一章,我們就要開始討論Runtime中最有意思的一部分:訊息處理機制。我們將詳細討論訊息的傳送及訊息的轉發。不過在討論訊息之前,我們先來了解一下與方法相關的一些內容。 基礎資料型別
iOS runtime執行時的用法(一)
<span style="color:#333333">RunTime簡稱執行時。OC就是執行時機制,也就是在執行時候的一些機制,其中最主要的是訊息機制。</span> 編譯時: 即編譯器對語言的編譯階段,編譯時只是對語言進行最基本的檢查
ios 使用執行時規避陣列等越界導致程式崩潰
#import "NSMutableArray+TonyRuntime.h"#import <objc/runtime.h>@implementation NSMutableArray (TonyRuntime)+(void)load{staticdispatch_once_t onceToken
iOS中runtime(執行時)的簡單介紹與應用
最近學習到runtime這一塊知識了所以就總結一下,以備以後要用。但是由於runtime這一塊的知識比較多所以今天在這裡只是做一個簡單的總結。 一、什麼是Runtime? Objective-C runtime是一個實現Objective-C語言的
iOS開發之關於Runtime執行時:類與物件
Objective-C語言是一門動態語言,它將很多靜態語言在編譯和連結時期做的事放到了執行時來處理。這種動態語言的優勢在於:我們寫程式碼時更具靈活性,如我們可以把訊息轉發給我們想要的物件,或者隨意交換一個方法的實現等。 這種特性意味著Objective-C不僅需要一個編譯器,還需要一個執行時系統
iOS學習筆記56(Runtime)-Objective-C Runtime 執行時之三:方法與訊息
前面我們討論了Runtime中對類和物件的處理,及對成員變數與屬性的處理。這一章,我們就要開始討論Runtime中最有意思的一部分:訊息處理機制。我們將詳細討論訊息的傳送及訊息的轉發。不過在討論訊息之前,我們先來了解一下與方法相關的一些內容。 基礎資料型別 SEL
解決iOS模擬器執行時上下出現黑邊的問題
在編寫iOS程式時,我們可能會遇到這種情況:在老版本的Xcode上寫的程式之前執行在模擬器的時候是正常的,但是現在執行就出現了上下出現黑邊的情況,如下圖所示: 那麼這究竟是什麼原因呢? 兩個圖片分別實在顯示為4S
runtime 執行時機制
runtime是一套比較底層的純C語言API, 屬於1個C語言庫, 包含了很多底層的C語言API。 在我們平時編寫的OC程式碼中, 程式執行過程時, 其實最終都是轉成了runtime的C語言程式碼, runtime算是OC的幕後工作者 比如說,下面一個建立物件的方法中, 舉例: OC : [[MJP
iOS-APP-執行時防Crash工具XXShield練就
原文地址 前言 正在執行的 APP 突然 Crash,是一件令人不爽的事,會流失使用者,影響公司發展,所以 APP 執行時擁有防 Crash 功能能有效降低 Crash 率,提升 APP 穩定性。但是有時候 APP Crash 是應有的表現,我們不讓 APPCrash 可能會導致別的邏輯錯誤
Java中Runtime執行時環境機制總結
最近由於在編碼中需要在java程式碼中執行linux命令,使用到了Runtime類的一些方法,也出現幾個小bug,所以趁這個機會對Runtime也就是執行時環境這個類進行總結。 Runtime.getRuntime()能得到一個Runtime物件例項,也就是當前執行時環境例
Objective-C Runtime 執行時之五:協議與分類
Objective-C中的分類允許我們通過給一個類新增方法來擴充它(但是通過category不能新增新的例項變數),並且我們不需要訪問類中的程式碼就可以做到。 Objective-C中的協議是普遍存在的介面定義方式,即在一個類中通過@protocol定義介面,在另外
Objective-C Runtime 執行時之六:拾遺
前面幾篇基本介紹了runtime中的大部分功能,包括對類與物件、成員變數與屬性、方法與訊息、分類與協議的處理。runtime大部分的功能都是圍繞這幾點來實現的。 本章的內容並不算重點,主要針對前文中對Objective-C Runtime Reference內容遺漏
Objective-C Runtime 執行時之一:類與物件
Objective-C語言是一門動態語言,它將很多靜態語言在編譯和連結時期做的事放到了執行時來處理。這種動態語言的優勢在於:我們寫程式碼時更具靈活性,如我們可以把訊息轉發給我們想要的物件,或者隨意交換一個方法的實現等。 這種特性意味著Objective-C不僅需要一
Objective-C Runtime 執行時之二:成員變數與屬性
在前面一篇文章中,我們介紹了Runtime中與類和物件相關的內容,從這章開始,我們將討論類實現細節相關的內容,主要包括類中成員變數,屬性,方法,協議與分類的實現。 本章的主要內容將聚集在Runtime對成員變數與屬性的處理。在討論之前,我們先介紹一個重要的概念:型別
Objective-C Runtime 執行時之三:方法與訊息
前面我們討論了Runtime中對類和物件的處理,及對成員變數與屬性的處理。這一章,我們就要開始討論Runtime中最有意思的一部分:訊息處理機制。我們將詳細討論訊息的傳送及訊息的轉發。不過在討論訊息之前,我們先來了解一下與方法相關的一些內容。 基礎資料型別 SEL
Objective-C Runtime 執行時之四:Method Swizzling
理解Method Swizzling是學習runtime機制的一個很好的機會。在此不多做整理,僅翻譯由Mattt Thompson發表於nshipster的Method Swizzling一文。 Method Swizzling是改變一個selector的實際實現的
詳解Runtime執行時機制
簡介 Runtime 又叫執行時,是一套底層的 C 語言 API,其為 iOS 內部的核心之一,我們平時編寫的 OC 程式碼,底層都是基於它來實現的。比如: [receiver message]; // 底層執行時會被編譯器轉化為: objc_msgSend(receive
Runtime執行時-應用篇
在上篇文章iOS執行時Runtime基礎後,本篇將會總結Rutime的具體應用例項,結合其動態特性,Runtime在開發中的應用大致分為以下幾個方面: 一、動態方法交換:Method Swizzling 實現動態方法交換(Method Swizz
[ObjectC]Runtime執行時之三:方法與訊息
這一章,我們就要開始討論Runtime中最有意思的一部分:訊息處理機制。我們將詳細討論訊息的傳送及訊息的轉發。 基礎資料型別 SEL SEL又叫選擇器,是表示一個方法的selector的指標,其定義如下:typedef struct objc_selector *SEL;o