NSInvocation基本用法

2021-09-11 12:59:42 字數 1902 閱讀 7922

在 ios中可以直接呼叫某個物件的訊息方式有兩種:

一種是performselector:withobject;

再一種就是nsinvocation。

第一種方式比較簡單,能完成簡單的呼叫。但是對於》2個的引數或者有返回值的處理,那performselector:withobject就顯得有點有心無力了,那麼在這種情況下,我們就可以使用nsinvocation來進行這些相對複雜的操作方法簽名類

// 方法簽名中儲存了方法的名稱/引數/返回值,協同nsinvocation來進行訊息的**

// 方法簽名一般是用來設定引數和獲取返回值的, 和方法的呼叫沒有太大的關係

//1、根據方法來初始化nsmethodsignature

nsmethodsignature *signature = [viewcontroller instancemethodsignatureforselector:@selector(run:)];

根據方法簽名來建立nsinvocation物件

// nsinvocation中儲存了方法所屬的物件/方法名稱/引數/返回值

//其實nsinvocation就是將乙個方法變成乙個物件

//2、建立nsinvocation物件

nsinvocation *invocation = [nsinvocation invocationwithmethodsignature:signature];

//設定方法呼叫者

invocation.target = self;

//注意:這裡的方法名一定要與方法簽名類中的方法一致

invocation.selector = @selector(run:);

nsstring *way = @"bycar";

//這裡的index要從2開始,以為0跟1已經被佔據了,分別是self(target),selector(_cmd)

[invocation setargument:&way atindex:2];

//3、呼叫invoke方法

[invocation invoke];

//實現run:方法

- (void)run:(nsstring *)method

複製**

優化

但是上述方法有很多弊端,首先我們來一一解決

1、如果呼叫的方法不存在

//此時我們應該判斷方法是否存在,如果不存在這丟擲異常

if (signature == nil)

複製**

2、方法的引數個數與外界傳進來的引數陣列元素個數不符
//此處不能通過遍歷引數陣列來設定引數,因為外界傳進來的引數個數是不可控的

//因此通過numberofarguments方法獲取的引數個數,是包含self和_cmd的,然後比較方法需要的引數和外界傳進來的引數個數,並且取它們之間的最小值

nsuinteger argscount = signature.numberofarguments - 2;

nsuinteger arrcount = objects.count;

nsuinteger count = min(argscount, arrcount);

for (int i = 0; i < count; i++)

[invocation setargument:&obj atindex:i + 2];

}3、判斷當前呼叫的方法是否有返回值

//方法一:

id res = nil;

if (signature.methodreturnlength != 0)

return res;

//方法二:

//可以通過signature.methodreturntype獲得返回的型別編碼,因此可以推斷返回值的具體型別

複製**

NSInvocation的基本用法

方法簽名中儲存了方法的名稱 引數 返回值,協同nsinvocation來進行訊息的 方法簽名一般是用來設定引數和獲取返回值的,和方法的呼叫沒有太大的關係 1 根據方法來初始化nsmethodsignature nsmethodsignature signature viewcontroller in...

NSInvocation使用示例

在 ios中可以直接呼叫 某個物件的訊息 方式有2種 第一種方式是使用nsobject類提供的performselector系列方法 還有一種方式就是使用nsinvocation進行動態執行時的訊息分發,動態的執行方法,相信大家一定經常使用nsobject類提供的performselector系列方...

NSInvocation使用示例

在 ios中可以直接呼叫 某個物件的訊息 方式有2種 第一種方式是使用nsobject類提供的performselector系列方法 還有一種方式就是使用nsinvocation進行動態執行時的訊息分發,動態的執行方法,相信大家一定經常使用nsobject類提供的performselector系列方...