最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

iOS中NSInvocation的基本用法教程

 更新時(shí)間:2017年09月13日 08:55:39   作者:木_木27  
NSInvocation是IOS消息傳遞和方法調(diào)用的一個(gè)類(lèi),下面這篇文章主要給大家介紹了關(guān)于iOS中NSInvocation的基本用法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們可以參考借鑒,下面隨著小編來(lái)一起看看吧。

前言

大家應(yīng)該都有所了解,在 iOS中可以直接調(diào)用某個(gè)對(duì)象的消息方式有兩種:一種是performSelector:withObject;再一種就是NSInvocation。

第一種方式比較簡(jiǎn)單,能完成簡(jiǎn)單的調(diào)用。但是對(duì)于>2個(gè)的參數(shù)或者有返回值的處理,那performSelector:withObject就顯得有點(diǎn)有心無(wú)力了,那么在這種情況下,我們就可以使用NSInvocation來(lái)進(jìn)行這些相對(duì)復(fù)雜的操作

NSInvocation的基本使用

方法簽名類(lèi)

// 方法簽名中保存了方法的名稱(chēng)/參數(shù)/返回值,協(xié)同NSInvocation來(lái)進(jìn)行消息的轉(zhuǎn)發(fā)
// 方法簽名一般是用來(lái)設(shè)置參數(shù)和獲取返回值的, 和方法的調(diào)用沒(méi)有太大的關(guān)系
//1、根據(jù)方法來(lái)初始化NSMethodSignature
NSMethodSignature *signature = [ViewController instanceMethodSignatureForSelector:@selector(run:)];

根據(jù)方法簽名來(lái)創(chuàng)建NSInvocation對(duì)象

// NSInvocation中保存了方法所屬的對(duì)象/方法名稱(chēng)/參數(shù)/返回值
//其實(shí)NSInvocation就是將一個(gè)方法變成一個(gè)對(duì)象
//2、創(chuàng)建NSInvocation對(duì)象
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
//設(shè)置方法調(diào)用者
invocation.target = self;
//注意:這里的方法名一定要與方法簽名類(lèi)中的方法一致
invocation.selector = @selector(run:);
NSString *way = @"byCar";
//這里的Index要從2開(kāi)始,以為0跟1已經(jīng)被占據(jù)了,分別是self(target),selector(_cmd)
[invocation setArgument:&way atIndex:2];
//3、調(diào)用invoke方法
[invocation invoke];
//實(shí)現(xiàn)run:方法
- (void)run:(NSString *)method{

}

優(yōu)化

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

1、如果調(diào)用的方法不存在

//此時(shí)我們應(yīng)該判斷方法是否存在,如果不存在這拋出異常
if (signature == nil) {
//aSelector為傳進(jìn)來(lái)的方法
NSString *info = [NSString stringWithFormat:@"%@方法找不到", NSStringFromSelector(aSelector)];
[NSException raise:@"方法調(diào)用出現(xiàn)異常" format:info, nil];
 }

2、方法的參數(shù)個(gè)數(shù)與外界傳進(jìn)來(lái)的參數(shù)數(shù)組元素個(gè)數(shù)不符

//此處不能通過(guò)遍歷參數(shù)數(shù)組來(lái)設(shè)置參數(shù),因?yàn)橥饨鐐鬟M(jìn)來(lái)的參數(shù)個(gè)數(shù)是不可控的
//因此通過(guò)numberOfArguments方法獲取的參數(shù)個(gè)數(shù),是包含self和_cmd的,然后比較方法需要的參數(shù)和外界傳進(jìn)來(lái)的參數(shù)個(gè)數(shù),并且取它們之間的最小值
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];
 // 判斷需要設(shè)置的參數(shù)是否是NSNull, 如果是就設(shè)置為nil
 if ([obj isKindOfClass:[NSNull class]]) {
  obj = nil;
 }
[invocation setArgument:&obj atIndex:i + 2];
}

3、判斷當(dāng)前調(diào)用的方法是否有返回值

//方法一:
id res = nil;
if (signature.methodReturnLength != 0) {//有返回值
 //將返回值賦值給res
 [invocation getReturnValue:&res];
}
return res;

//方法二:
//可以通過(guò)signature.methodReturnType獲得返回的類(lèi)型編碼,因此可以推斷返回值的具體類(lèi)型

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • iOS開(kāi)發(fā)自定義頁(yè)腳和頁(yè)眉技巧詳解

    iOS開(kāi)發(fā)自定義頁(yè)腳和頁(yè)眉技巧詳解

    這篇文章主要為大家介紹了iOS開(kāi)發(fā)自定義頁(yè)腳和頁(yè)眉的技巧示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • iOS實(shí)現(xiàn)手勢(shì)密碼功能

    iOS實(shí)現(xiàn)手勢(shì)密碼功能

    這篇文章主要為大家詳細(xì)介紹了iOS實(shí)現(xiàn)手勢(shì)密碼功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • iOS 控件封裝(又名擰螺絲)之排序按鈕的開(kāi)發(fā)

    iOS 控件封裝(又名擰螺絲)之排序按鈕的開(kāi)發(fā)

    排序按鈕是實(shí)際開(kāi)發(fā)中比較常見(jiàn)的一種控件,這篇文章主要介紹了iOS 開(kāi)發(fā)之排序按鈕,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • ios實(shí)現(xiàn)自動(dòng)獲取label高度、寬度及最后一個(gè)位置詳解

    ios實(shí)現(xiàn)自動(dòng)獲取label高度、寬度及最后一個(gè)位置詳解

    這篇文章主要給大家介紹了關(guān)于ios如何實(shí)現(xiàn)自動(dòng)獲取label高度、寬度及最后一個(gè)位置的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-10-10
  • iOS彈幕開(kāi)發(fā)中遇到的問(wèn)題匯總

    iOS彈幕開(kāi)發(fā)中遇到的問(wèn)題匯總

    最近做項(xiàng)目的時(shí)候需要實(shí)現(xiàn)彈幕這個(gè)功能, 雖然感覺(jué)實(shí)現(xiàn)起來(lái)也不是很復(fù)雜,但還是遇到了一些問(wèn)題,下面這篇文章主要給大家總結(jié)介紹了在iOS彈幕開(kāi)發(fā)中遇到的問(wèn)題,文中將解決的方法介紹的非常詳細(xì),需要的朋友可以參考下。
    2018-01-01
  • iOS UICollectionView實(shí)現(xiàn)標(biāo)簽選擇器

    iOS UICollectionView實(shí)現(xiàn)標(biāo)簽選擇器

    這篇文章主要為大家詳細(xì)介紹了iOS UICollectionView實(shí)現(xiàn)標(biāo)簽選擇器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • iOS開(kāi)發(fā)之時(shí)間戳(或date)轉(zhuǎn)字符串的實(shí)例代碼

    iOS開(kāi)發(fā)之時(shí)間戳(或date)轉(zhuǎn)字符串的實(shí)例代碼

    這篇文章主要介紹了iOS開(kāi)發(fā)之時(shí)間戳(或date)轉(zhuǎn)字符串的實(shí)例代碼,需要的朋友可以參考下
    2017-10-10
  • iOS超出父控件范圍無(wú)法點(diǎn)擊問(wèn)題解決

    iOS超出父控件范圍無(wú)法點(diǎn)擊問(wèn)題解決

    這篇文章主要介紹了iOS超出父控件范圍無(wú)法點(diǎn)擊問(wèn)題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • iOS通過(guò)多種方式創(chuàng)建控制器

    iOS通過(guò)多種方式創(chuàng)建控制器

    這篇文章主要為大家詳細(xì)介紹了iOS通過(guò)多種方式創(chuàng)建控制器的相關(guān)方法,感興趣的小伙伴們可以參考一下
    2016-04-04
  • iOS中實(shí)現(xiàn)圖片自適應(yīng)拉伸效果的方法

    iOS中實(shí)現(xiàn)圖片自適應(yīng)拉伸效果的方法

    圖片拉伸在移動(dòng)開(kāi)發(fā)中特別常見(jiàn),比如常用的即時(shí)通訊應(yīng)用中的聊天氣泡就需要根據(jù)文字長(zhǎng)度對(duì)背景圖片進(jìn)行拉伸自適應(yīng)。下面這篇文章主要給大家介紹了iOS中實(shí)現(xiàn)圖片自適應(yīng)拉伸效果的方法,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-03-03

最新評(píng)論

瓦房店市| 清流县| 祁阳县| 南充市| 察雅县| 桃园市| 积石山| 汉源县| 宁陵县| 仪征市| 永安市| 临清市| 昆山市| 玉树县| 邹城市| 宿迁市| 尼玛县| 南昌市| 巴中市| 隆化县| 澄江县| 茌平县| 永寿县| 鹿邑县| 灵武市| 常熟市| 大安市| 阳江市| 锡林浩特市| 白河县| 博兴县| 雅江县| 长治县| 明溪县| 淮滨县| 巴青县| 盐津县| 芒康县| 堆龙德庆县| 泰安市| 当涂县|