在 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系列方...