1. 程式人生 > >iOS runtime執行時特性解決陣列越界問題。

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

iOSruntime(執行)的簡單介紹與應用

最近學習到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