1. 程式人生 > >利用Objective-C的反射機制和執行時特性實現類靜態方法的動態訪問(一)

利用Objective-C的反射機制和執行時特性實現類靜態方法的動態訪問(一)

如題,灑家今天在搭建蘋果手機APP開發框架中遇到一個坑爹問題,折騰了半天,總算研究出來了,特記錄如下:

1、先說具體需求,本人實現了一個自定義檢視控制元件,通過KVC特性先從plist配置檔案中讀取資料,轉換成模型物件,然後根據模型物件動態建立檢視物件,這時就需要用到Objective-C的反射機制和執行時特性實現類方法的動態訪問了;

2、動態訪問類方法又可分為以下兩種情況:

1)訪問動態方法,很簡單,直接使用NSObject類中現成的方法即可;

- (id)performSelector:(SEL)aSelector;
- (id)performSelector:(SEL)aSelector withObject:(id)object;

2)訪問靜態方法,這就需要用到執行時特性了;

#import <objc/objc.h>
#import <Foundation/Foundation.h>
- (id)invokeMethod:(Class)clazz withName:(NSString *)name
{
    id result = nil; 
    SEL sel = NSSelectorFromString(name); 
    IMP imp = [clazz methodForSelector:sel]; 
    result = imp(clazz, sel); 
    return result;
}
- (id)invokeMethod:(Class)clazz withName:(NSString *)name withParam:(id)param
{
    id  result = nil;
    SEL sel = NSSelectorFromString(name);
    IMP imp = [clazz methodForSelector:sel];
    result = imp(clazz, sel, param);
    return result;
}

3)特別地,要使用IMP特性,需要把執行時庫的標頭檔案objc.h匯入進來,對IMP型別的定義如下:

/// A pointer to the function of a method implementation. 
#if !OBJC_OLD_DISPATCH_PROTOTYPES
typedef void (*IMP)(void /* id, SEL, ... */ ); 
#else
typedef id (*IMP)(id, SEL, ...); 
#endif

4)使用XCode6.X的小夥伴們要特別注意了,需要先到專案的構建設定裡面把Apple LLVM 6.0 - Preprocessing

Enable Strict Checking of objc_msgSend Calls 選項設定為NO,否則result = imp(clazz, sel);會報錯的!!


相關推薦

利用Objective-C反射機制執行特性實現靜態方法動態訪問

如題,灑家今天在搭建蘋果手機APP開發框架中遇到一個坑爹問題,折騰了半天,總算研究出來了,特記錄如下: 1、先說具體需求,本人實現了一個自定義檢視控制元件,通過KVC特性先從plist配置檔案中讀取資料,轉換成模型物件,然後根據模型物件動態建立檢視物件,這時就需要用到Obj

利用Objective-C反射機制執行特性實現靜態方法動態訪問

繼上次的研究成果繼續深入研究,灑家又完善了下在執行時動態呼叫所有OC類方法的公用方法: typedef void*(*ObjcMsgSend)(id, SEL, ...); - (void *)invoke:(id)inst method:(NSString *)nam

併發程式設計—— Java 執行緒池 實現原理與原始碼深度解析

史上最清晰的執行緒池原始碼分析 鼎鼎大名的執行緒池。不需要多說!!!!! 這篇部落格深入分析 Java 中執行緒池的實現。 總覽 下圖是 java 執行緒池幾個相關類的繼承結構:    先簡單說說這個繼承結構,Executor 位於最頂層,也是最簡單的,就一個 execute(

iOS 開發--Objective-C 反射機制

瞭解反射機制 Objective-C語言中的OC物件,都繼承自NSObject類。這個類為我們提供了一些基礎的方法和協議,我們可以直接呼叫從這個類繼承過來方法。當然,本篇文章中講到的反射方法,就在NSObject和Foundation框架中。 反射機制涉及到的東西比較

C++反射機制:可變引數模板實現C++反射

### 1. 概要   2018年Bwar釋出了[《C++反射機制:可變引數模板實現C++反射》](https://www.cnblogs.com/bwar/p/9304261.html),文章非常實用,Bwar也見過好幾個看了那篇文章後以同樣方法實現反射的專案,也見過不少從我的文章抄過去連程式碼風格類名函式

C語言實現串列埠通訊知識點整理執行緒、開啟串列埠、設定波特率、設定校驗位、互斥鎖等實現基本的通訊

  部分程式碼借鑑地址:https://blog.csdn.net/wangqingchuan92/article/details/73497354/ 謝謝! 1.建立執行緒線上程內進行串列埠之間的收發 void CREAT_pthread(void) { pthr

Java反射機制動態代理

導讀: 1. 什麼是反射 2. 反射的基本使用 3. 反射的使用例項 一、什麼是反射?   Java反射機制是在執行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個物件,都能夠呼叫它的任意一個方法和屬性;這

jquery中append、prepend, beforeafter方法的區別

mod serve com oos 兄弟節點 sha pos 插入 5% 原文:http://blog.csdn.net/woosido123/article/details/64439490 在 jquery中append() 與 prepend()是在元素內插

用CocosCreatorPomelo編寫多人在線實時聊天室----基礎知識環境安裝

shu 以及 pan 信息 ast pre alt web 技術 客戶端:Cocos Creator 1.6.2服務器端:Pomelo 2.2.5源碼地址:https://github.com/foupwang/CocosCreatorChatForPomelo.git 本

getpost的區別--面試經常被問到!

修改 史記 限制 url地址 完整 返回 協議頭 作用 delet 了解歷史 get和post是HTTP與服務器交互的方式, 說到方式,其實總共有四種:put,delete,post,get。 他們的作用分別是對服務器資源的增,刪,改,查。 所以,get是獲取數據,po

C程式設計|用函式實現模組化程式設計詳解

目錄 一、為什麼要用函式 使用函式可使程式清晰、精煉、簡單、靈活。 函式就是功能。每一個函式用來實現一個特定的功能。函式名應反映其代表的功能。 在設計

QGraphicsView的在過載重繪函式,繪製控制元件的注意事項

在QGraphicsView中進行繪製的時候,注意座標對映,mapToScene,mapFromScene等可以實現scene和view的座標關係,但是在繪製控制元件的時候,不能涉及到w,h等長度概念,

leetcode——動態規劃:最大子序

動態規劃是一種非常重要的演算法思想,畢竟是一種思想,所以在邏輯層面的體現並沒有一個固定的形式,但是處理問題的方式卻都是本著一個原則:將一個問題遞迴分解為它的子問題進行求解,也許有人會問:這不是分治的思想嘛?因為問題分解的過程中往往會產生很多重複的子問題,這個時候動態規劃和分支

想進大廠?50個多執行緒面試題,你會多少?

最近看到網上流傳著,各種面試經驗及面試題,往往都是一大堆技術題目貼上去,而沒有答案。 不管你是新程式設計師還是老手,你一定在面試中遇到過有關執行緒的問題。Java語言一個重要的特點就是內建了對併發的支援,讓Java大受企業和程式設計師的歡迎。大多數待遇豐厚的J

java靜態代理動態代理

代理Proxy:  Proxy代理模式是一種結構型設計模式,主要解決的問題是:在直接訪問物件時帶來的問題。  代理是一種常用的設計模式,其目的就是為其他物件提供一個代理以控制對某個物件的訪問。代理類負責為委託類預處理訊息,過濾訊息並轉發訊息,以及進行訊息被委託類執行後的後續處理。 &

python一行程式碼實現百度翻譯有道翻譯結果獲取-----py學習爬蟲歷程

更新(18-6-2):利用requests庫只需一行程式碼就可以獲取結果,程式碼在最後前言:本文參考於https://blog.csdn.net/c406495762/article/details/59095864一.本節主要用到的知識1-1:urllib.request.

遞迴動態規劃

換錢的方法數 題目:給定陣列arr, arr中所有的值都為正數且不重複。每個值代表一種面值貨幣,每種面值的貨幣可以使用任意張,再給定一個整數aim代表要找的錢數,求換錢有多少種方法。 解題思路: 解法一:暴力遞迴 如果arr={5,10,25,1}, aim=1000,過程

Qt總結之一:遍歷資料夾檔案目錄,並過濾獲取檔案資訊、字尾名、字首名

一、採用遞迴和QDir實現資料夾下所有檔案遍歷的方法 #include <QDir> bool FindFile(const QString & path) {     QDir dir(path);   if (!dir.exists(

C#進階系列——MEF實現設計上的“鬆耦合”

前言:最近去了趟外地出差,介紹推廣小組開發的框架類產品。推廣物件是本部門在專案上面的同事——1到2年工作經驗的初級程式設計師。在給他們介紹框架時發現很多框架設計層面的知識他們都沒有接觸過,甚至沒聽說過,這下囧了~~於是乎在想該如何跟他們解釋MEF、AOP、倉儲模式等方面的東東。本來 C#基礎系列 應該還有兩篇

opencv中Mat的賦值訪問

//為矩陣元素賦值 CV_MAT_ELEM( *mat, float, 0, 0 ) = 1.f;                                                                                       CV_MAT_ELEM( *mat,