国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > iOS > 正文

iOS中NSInvocation的基本用法教程

2020-02-19 15:45:37
字體:
來源:轉載
供稿:網友

我們在了解nsinvocation之前,我們通常使用兩種方法進行開發調用,話不多說,下面就來武林技術頻道了解iOS中NSInvocation的基本用法教程吧!

前言

大家應該都有所了解,在 iOS中可以直接調用某個對象的消息方式有兩種:一種是performSelector:withObject;再一種就是NSInvocation。

第一種方式比較簡單,能完成簡單的調用。但是對于>2個的參數或者有返回值的處理,那performSelector:withObject就顯得有點有心無力了,那么在這種情況下,我們就可以使用NSInvocation來進行這些相對復雜的操作

NSInvocation的基本使用

方法簽名類

// 方法簽名中保存了方法的名稱/參數/返回值,協同NSInvocation來進行消息的轉發// 方法簽名一般是用來設置參數和獲取返回值的, 和方法的調用沒有太大的關系//1、根據方法來初始化NSMethodSignatureNSMethodSignature *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) {//aSelector為傳進來的方法NSString *info = [NSString stringWithFormat:@"%@方法找不到", NSStringFromSelector(aSelector)];[NSException raise:@"方法調用出現異常" format:info, 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++) { id obj = objects[i]; // 判斷需要設置的參數是否是NSNull, 如果是就設置為nil if ([obj isKindOfClass:[NSNull class]]) {  obj = nil; }[invocation setArgument:&obj atIndex:i + 2];}

3、判斷當前調用的方法是否有返回值

//方法一:id res = nil;if (signature.methodReturnLength != 0) {//有返回值 //將返回值賦值給res [invocation getReturnValue:&res];}return res;//方法二://可以通過signature.methodReturnType獲得返回的類型編碼,因此可以推斷返回值的具體類型

以上這些是武林技術頻道小編介紹的iOS中NSInvocation的基本用法教程, 看完這些,相信這個問題已經難不倒我們了,趕緊行動起來吧。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 贵南县| 海丰县| 甘泉县| 桐庐县| 三亚市| 沿河| 鹤峰县| 文山县| 禹州市| 奈曼旗| 怀柔区| 玉田县| 白玉县| 奉节县| 锡林浩特市| 都江堰市| 宣化县| 元江| 富裕县| 利辛县| 湘潭县| 昌乐县| 岳阳县| 简阳市| 百色市| 秦安县| 濮阳县| 大荔县| 昔阳县| 崇明县| 睢宁县| 时尚| 岳西县| 永泰县| 和硕县| 沿河| 修武县| 沙坪坝区| 甘洛县| 莆田市| 长岭县|