1. 程式人生 > >ios筆記-runtime Method詳解

ios筆記-runtime Method詳解

Runtime Method 介紹:
Method型別是一個objc_method結構體指標,objc_method有三個成員

typedef struct objc_method Method;

struct objc_method{

SEL method_name;  //方法的名稱

char *method_typesE;//引數和返回型別的描述字串

IMP  method_imp;   //方法具體實現的指標

}

// 函式呼叫,但是不接收返回值型別為結構體

method_invoke

// 函式呼叫,但是接收返回值型別為結構體

method_invoke_stret

// 獲取函式名

method_getName

// 獲取函式實現IMP

method_getImplementation

// 獲取函式type encoding ,其結果是一串值

method_getTypeEncoding

// 複製返回值型別

method_copyReturnType

// 複製引數型別

method_copyArgumentType

// 獲取返回值型別

method_getReturnType

// 獲取引數個數

method_getNumberOfArguments

// 獲取函式引數型別

method_getArgumentType

// 獲取函式描述

method_getDescription

// 設定函式實現IMP

method_setImplementation

// 交換函式的實現IMP

method_exchangeImplementations

小提示:

void *memset(void *s, int ch, size_t n);

函式解釋:將s中前n個位元組 (typedef unsigned int size_t )用 ch 替換並返回 s 。

memset:作用是在一段記憶體塊中填充某個給定的值,它是對較大的結構體或陣列進行清零操作的一種最快方法[1]  

- (void)getAllMethods{
    //獲取所有方法
    unsigned int outCount = 0;
    Method *methods = class_copyMethodList([self class], &outCount);
    for (int i = 0; i<outCount; i++) {
        //1.獲取方法
        Method method = methods[i];
        SEL methodName = method_getName(method);
        NSLog(@"方法名:%@",NSStringFromSelector(methodName));
        
        //2.獲取方法裡的輸入引數
        unsigned int argCount = method_getNumberOfArguments(method);
        char argName[512] = {};
        for (int j = 0; j< argCount; j++) {
            method_getArgumentType(method, j, argName, 512);
            NSLog(@"引數型別:%s",argName);
            memset(argName, '\0', strlen(argName));
        }
       
        //3.獲取方法返回值型別
        char retType[512] = {};
        method_getReturnType(method, retType, 512);
        NSLog(@"返回型別值型別:%s",retType);
        
        //4.輸出返回型別輸入引數混合編碼格式: "返回值型別"+基地址偏移+"@"+基地址偏移+":"+基地址偏移+"輸入引數1型別"+基地址偏移+"輸入引數2型別"+基地址偏移+....
        NSLog(@"返回型別輸入引數混合編碼:%s",method_getTypeEncoding(method));
    }
    free(methods);
}

method_invoke的介紹

Method method = class_getInstanceMethod([ViewController class], NSSelectorFromString(@"getAllMethods"));

    method_invoke([ViewController class], method);

<===> ((void (*)(id,SEL))objc_msgSend)((id)self,NSSelectorFromString(@"getAllMethods"));


//列印結果

2016-03-25 13:20:11.598 runtimeMethodDemo[1610:187967] 方法名:getAllMethods

2016-03-25 13:20:11.600 runtimeMethodDemo[1610:187967] 引數型別:@

2016-03-25 13:20:11.600 runtimeMethodDemo[1610:187967] 引數型別::

2016-03-25 13:20:11.600 runtimeMethodDemo[1610:187967] 返回型別值型別:v

2016-03-25 13:20:11.601 runtimeMethodDemo[1610:187967] 返回型別輸入引數混合編碼:[email protected]:8

2016-03-25 13:20:11.601 runtimeMethodDemo[1610:187967] 方法名:setVc:

2016-03-25 13:20:11.601 runtimeMethodDemo[1610:187967] 引數型別:@

2016-03-25 13:20:11.601 runtimeMethodDemo[1610:187967] 引數型別::

2016-03-25 13:20:11.602 runtimeMethodDemo[1610:187967] 引數型別:@

2016-03-25 13:20:11.602 runtimeMethodDemo[1610:187967] 返回型別值型別:v

2016-03-25 13:20:11.602 runtimeMethodDemo[1610:187967] 返回型別輸入引數混合編碼:[email protected]:[email protected]

2016-03-25 13:20:11.602 runtimeMethodDemo[1610:187967] 方法名:noRetNoArg

2016-03-25 13:20:11.602 runtimeMethodDemo[1610:187967] 引數型別:@

2016-03-25 13:20:11.603 runtimeMethodDemo[1610:187967] 引數型別::

2016-03-25 13:20:11.603 runtimeMethodDemo[1610:187967] 返回型別值型別:v

2016-03-25 13:20:11.605 runtimeMethodDemo[1610:187967] 返回型別輸入引數混合編碼:[email protected]:8



相關推薦

ios筆記-runtime Method

Runtime Method 介紹:Method型別是一個objc_method結構體指標,objc_method有三個成員 typedef struct objc_method Method;

iOS學習筆記5-MPMoviePlayerController

MPMoviePlayerController 在iOS中播放視訊可以使用MediaPlayer.framework種的MPMoviePlayerController類來完成,它支援本地視訊和網路視訊播放。這個類實現了MPMediaPlayback協議,因此具備一般的播放器

OC學習小結之ios運行過程

for cat 用戶 with res nbsp c學習 launch cati 1)ios核心類 UIView 視圖,屏幕上能看得見的東西都是視圖,例如:按鈕、文本標簽、和表格等 UIViewController:內部默認有個視圖(UIView),負責管理UIView的

10.5-全棧Java筆記:常見流(三)

java上節我們講到「Java中常用流:緩沖流」,本節我們學習數據流和對象流~ 數據流數據流將“基本數據類型變量”作為數據源,從而允許程序以與機器無關方式從底層輸入輸出流中操作java基本數據類型。 DataInputStream和DataOutputStream提供了可以存取與機器無關的所有Java基礎類

iOS 運行時

序列 get not oci protocol caption 聲明 實現 att 註:本篇文章轉自:http://www.jianshu.com/p/adf0d566c887 一、運行時簡介 Objective-C語言是一門動態語言,它將很多靜態語言在編譯和鏈接時期做的事

iOS Code Signing: 解惑

唯一標識 解惑 並且 iphone 條件 等於 個人開發 視覺 電腦 原文鏈接地址:http://www.cnblogs.com/andyque/archive/2011/08/30/2159086.html iPhone開發的代碼簽名 代碼簽名確保代碼的真實以及明確識

iOS APP上架流程

復制 存儲 iphone6 調試 5.1 編輯 gre 9.png 待審核 iOS APP上架流程詳解 青蔥烈馬 2016.04.28 前言:作為一名 iOS 開發工程師, APP 的上架是必備技能. iOS 上架的流程主要可以簡單總結為: 一個包,兩個

iOS事件傳遞機制

概述 當用戶觸控實際螢幕時,會生成一個Touch Event,將此事件新增到UIApplication管理的事件佇列之中。 UIApplication從事件佇列之中按順序取出事件分發到檢視去處理。 當事件被髮出以後,會從keyWindow開始,依次向上傳遞,包括

網路__筆記_TCP/IP___第一章

1.1.3    差錯控制和流量控制         網路的底層是通訊通道的組合。由於噪聲、硬體故障、資料被篡改......的原因,往往會出現資料的損壞或丟失。對這些錯誤i的處理,稱為差錯控制。在網路中,由於不穩定的各種因素,當

expect學習筆記及例項

expect學習筆記及例項詳解 引用自:http://wenku.baidu.com/view/b65e103610661ed9ad51f374.html   1. expect 是基於tcl 演變而來的,所以很多語法和tcl 類似,基本的語法如下 所示: 1.1 首行

ios 單例模式

單例:在寫專案的時候,我們實際用到了很多系統給我們提供的單例類; 如: [UIApplication sharedApplication]; //應用程式例項類 [NSNotificationCenter defaultCenter];//訊息中心例項類 [NSFileMana

iOS——內購支付後臺操作(一)

一、思維導圖 二、重點總結: 1.獲取內購列表(從App內讀取或從自己伺服器讀取) 2.App Store請求可用的內購列表 3.向用戶展示內購列表 4.使用者選擇了內購列表,再發個購買請求,收到購買完成的回撥(購買完成後會把錢打給申請內購的銀行卡內) 5.購買流程結束

C語言學習筆記---malloc函式

                                                                                            malloc函式詳解 一、malloc函式標頭檔案: #include<stdli

IOS開發之Block

從Mac OS X 10.6以及iOS4開始,蘋果在GCC和Clang編譯器中為C語言引入了一個新擴充套件:Blocks,使得程式設計師可以在C、Objective-C、C++和Objective-C中使用閉包。Blocks有點像函式,但是它可以在其它函式或方法中進行宣告和定義,同時它還是匿名的(匿名函式)

iOS UITabBarController用法原理(一)、自定義tabbar

UITabBarController的原理:UITabBarController會一次性初始化所有子控制器,但是預設只加載第一個控制器檢視,其他檢視控制器只初始化預設不會載入,只有當需要顯示的時候才loadView載入,為了能夠將其他子控制器也正常顯示在Tab bar中,我們

IOS-TextField控制元件

//初始化textfield並設定位置及大小   UITextField *text = [[UITextField alloc]initWithFrame:CGRectMake(20, 20, 130, 30)]; //設定邊框樣式,只有設定了才會顯示邊框樣式     text.borderSty

C++筆記:模板(一)

C++模板   模板是C++支援引數化多型的工具,使用模板可以使使用者為類或者函式宣告一種一般模式,使得類中的某些資料成員或者成員函式的引數、返回值取得任意型別。   模板是一種對型別進行引數化的工具;   通常有兩種形式:函式模板和類模板;   函式模板針對僅引

斯坦福大學的機器學習筆記SVM初探

最近在看斯坦福大學的機器學習的公開課,學習了支援向量機,再結合網上各位大神的學習經驗總結了自己的一些關於支援向量機知識。 一、什麼是支援向量機(SVM)? 1、支援向量機(Support Vector Machine,常簡稱為SVM)是一種監督式學習的方法,可廣泛地應用於統

iOS水波紋動畫

水波動畫的關鍵點就是正餘弦函式 正弦型函式解析式:y=Asin(ωx+φ)+h 各常數值對函式影象的影響: φ(初相位):決定波形與X軸位置關係或橫向移動距離(左加右減) ω:決定週期(最小正週期T=2π/|ω|) A:決定峰

iOS UIButton之UIEdgeInsets

級別:★★☆☆☆ 標籤:「UIButton內偏移量」「titleEdgeInsets」「imageEdgeInsets」 作者: MrLiuQ 審校: QiShare團隊 我們先看一下蘋果官方對UIEdgeInsets說明: typedef struct UIEdgeInset