偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Object-C中編寫(xiě)省略參數(shù)的多參函數(shù)

開(kāi)發(fā) 后端
在Object-C中,我們會(huì)遇到很多像NSLog這樣的函數(shù),其中參數(shù)的個(gè)數(shù)不確定,由程序員自由控制,在初始化數(shù)組,字典等方面應(yīng)用廣泛,那么,這類(lèi)的函數(shù)是如何實(shí)現(xiàn)的呢?我們?cè)趺淳帉?xiě)我們自己的省略參數(shù)的函數(shù)呢?

Object-C中編寫(xiě)省略參數(shù)的多參數(shù)函數(shù) 引語(yǔ):

在Object-C中,我們會(huì)遇到很多像NSLog這樣的函數(shù),其中參數(shù)的個(gè)數(shù)不確定,由程序員自由控制,在初始化數(shù)組,字典等方面應(yīng)用廣泛,那么,這類(lèi)的函數(shù)是如何實(shí)現(xiàn)的呢?我們?cè)趺淳帉?xiě)我們自己的省略參數(shù)的函數(shù)呢?當(dāng)然,這不是唯一的多參函數(shù)的處理方法,你也可以通過(guò)一個(gè)字典或者數(shù)組傳遞參數(shù)。但C為我們提供的這樣的一種機(jī)制,無(wú)疑是最方便的。

[[136448]]

一、了解幾個(gè)概念

 

  1. va_list 

C語(yǔ)言中定義的一個(gè)指針,用于指向當(dāng)前的參數(shù)。

  1. va_start(ap,param) 

這個(gè)宏是初始化參數(shù)列表,其中***個(gè)參數(shù)是va_list對(duì)象,第二個(gè)參數(shù)是參數(shù)列表的***個(gè)參數(shù)。

  1. va_arg(ap, type) 

一個(gè)用于取出參數(shù)的宏,這個(gè)宏的***個(gè)參數(shù)是va_list對(duì)象,第二個(gè)參數(shù)是要取出的參數(shù)類(lèi)型。

  1. va_end(ap) 

這個(gè)宏用于關(guān)閉取參列表

二、多參函數(shù)的取參原理

在編寫(xiě)我們自己的多參函數(shù)之前,明白函數(shù)的取參原理是十分重要的,首先,函數(shù)的參數(shù)是被放入我們內(nèi)存的棧段的,而且放入的順序是從后往前放入,比如如果一個(gè)函數(shù)參數(shù)如下:

  1. void func(int a,int b,int c,int d) 

那么傳遞參數(shù)的時(shí)候參數(shù)d先入棧,接著是c、b、a。如此這樣,在取參的時(shí)候,根據(jù)堆棧的取值原則,則取值順序?yàn)閍、b、c、d。所以在原理上,只要我們知道***個(gè)參數(shù)的地址和每個(gè)參數(shù)的類(lèi)型,我們就可以將參數(shù)都取出來(lái)。而上面介紹的幾個(gè)宏,就是幫助我們做這些的。

三、聲明與實(shí)現(xiàn)省略參數(shù)的多參函數(shù)

"..."這個(gè)符號(hào)就是我們用來(lái)實(shí)現(xiàn)省略參數(shù)函數(shù)的符號(hào)。例如我們模擬實(shí)現(xiàn)一個(gè)log函數(shù)如下: ? 1 2 3 4 5 6 7 8 9 10 -(void)myLog:(NSString *)str,...{//省略參數(shù)的寫(xiě)法 va_list list;//創(chuàng)建一個(gè)列表指針對(duì)象 va_start(list, str);//進(jìn)行列表的初始化,str為省略前的***個(gè)參數(shù),及...之前的那個(gè)參數(shù) NSString * temStr = str; while (temStr!=nil) {//如果不是nil,則繼續(xù)取值 NSLog(@"%@",temStr); temStr = va_arg(list, NSString*);//返回取到的值,并且讓指針指向下一個(gè)參數(shù)的地址 } va_end(list);//關(guān)閉列表指針 }

注意,調(diào)用時(shí),我們必須在參數(shù)的***加上nil這個(gè)判斷結(jié)束的條件: ? 1 [self myLog:@"312",@"321", nil];//必須有nil 四、一點(diǎn)補(bǔ)充

細(xì)心的你可能發(fā)現(xiàn)了,這里的nil是我們?cè)谡{(diào)用函數(shù)時(shí)手動(dòng)加上的,可是系統(tǒng)的許多函數(shù)在我們調(diào)用時(shí),系統(tǒng)直接幫我們加上了參數(shù)結(jié)尾的那個(gè)nil,例如

  1. NSArray * array = [NSArray arrayWithObjects:(id), nil] 

這是如何做到的呢?我們只需要在函數(shù)的聲明里加上一個(gè)宏,就可以實(shí)現(xiàn)這個(gè)功能,修改如下: ? 1 2 3 4 5 6 7 8 9 10 -(void)myLog:(NSString *)str,...NS_REQUIRES_NIL_TERMINATION{//這里加上一個(gè)宏 va_list list; va_start(list, str); NSString * temStr = str; while (temStr!=nil) { NSLog(@"%@",temStr); temStr = va_arg(list, NSString*); } va_end(list); }

顧名思義,這個(gè)宏的作用就是在結(jié)束位置加上我們需要的nil。

 

 
責(zé)任編輯:王雪燕 來(lái)源: 開(kāi)源中國(guó)社區(qū)
相關(guān)推薦

2017-08-04 17:44:02

2017-02-27 15:43:14

iOSObject-CJava

2015-04-17 16:07:11

swiftOC

2010-08-26 13:32:05

CSSmargin參數(shù)

2023-11-17 14:10:08

C++函數(shù)

2021-02-06 10:27:45

C#函數(shù)參數(shù)

2021-01-13 06:58:35

C語(yǔ)言函數(shù)指針

2009-08-14 09:43:59

C#復(fù)制構(gòu)造函數(shù)

2009-07-31 15:27:24

C# Object.E

2021-06-09 07:32:18

C++內(nèi)置函數(shù)函數(shù)傳參

2010-11-08 14:47:02

Powershell函數(shù)

2020-02-28 09:00:00

ObjectC#編程語(yǔ)言

2020-06-17 17:29:11

BashLinux

2010-01-20 17:32:16

C++函數(shù)

2009-07-31 14:20:46

結(jié)構(gòu)數(shù)組C#函數(shù)的參數(shù)

2012-09-18 13:26:39

CC++

2025-02-12 10:51:51

2024-04-25 08:24:51

C#系統(tǒng)操作日志

2010-01-27 17:16:52

C++構(gòu)造函數(shù)

2010-01-26 10:42:26

C++函數(shù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)