iOS可變參數(shù)實現(xiàn)及原理剖析

iOS可變參數(shù)實現(xiàn)及原理剖析

標簽(空格分隔): iOS可變參數(shù) iOS方法后面為什么有nil參數(shù)


你一定會時常見到有些方法的最后會有一個無關(guān)痛癢的 nil 參數(shù),可曾想過為什么要帶這個參數(shù)呢。

解答:因為這里參數(shù)的傳遞是可變參數(shù)的傳遞恐锦,拿[NSArray arrayWithObjects:]為例子癣诱,我們進入他的接口文件去看會看到接口的實現(xiàn)是這樣的


+ (instancetype)arrayWithObjects:(ObjectType)firstObj, ... NS_REQUIRES_NIL_TERMINATION;

最后的參數(shù)是一個宏定義虐杯,字面的意思是NS系列的‘需要以nil作為終止符‘

這里由于是可變參數(shù)六剥,所以參數(shù)的個數(shù)并不確定哥纫,所有在系統(tǒng)進行遍歷該你傳進去的參數(shù)時會進行判斷是否讀取到nil的終止符深纲。當(dāng)讀到終止符nil時確定參數(shù)的個數(shù)停止進行遍歷

(這也就是為什么當(dāng)數(shù)組中對象是nil值的時候劫灶,后面的值就加不進去的原因划址。所以數(shù)組的初始化盡量使用字面量形式扔嵌,字面量可以導(dǎo)致錯誤展現(xiàn)出來。不至于不知道哪里錯了)

由此夺颤,我們可以自己進行方法的設(shè)定時痢缎,也能實現(xiàn)可變參數(shù)的實現(xiàn)(Java的可變參數(shù)比objective-c要容易的多),實現(xiàn)如下


聲明

- (void)test:(NSString *)first,...NS_REQUIRES_NIL_TERMINATION;


實現(xiàn)

//可變參數(shù)

- (void)test:(NSString *)first,...{

//參數(shù)鏈表指針

va_list list;

//遍歷開始

va_start(list, first);

//知道讀取到下一個時nil時結(jié)束遞增

for (NSString *str = first; str != nil; str = va_arg(list, NSString*)) {

NSLog(@"%@",str);

}

//結(jié)束遍歷

va_end(list);

}

到這里世澜,你會想独旷,既然va_list是一個鏈表指針,為什么沒有*呢寥裂。不錯嵌洼,這里確實是應(yīng)該有一個 * 號但是,你再看封恰,我們順藤摸瓜麻养,進入 va_list的實現(xiàn)中去,他是這樣定義的


typedef __darwin_va_list va_list;


typedef void *  __darwin_va_list;   /* va_list */

沒錯,你會看到這里他確實是一個指針诺舔,只不過給他重定義了而已鳖昌。

在講他的實現(xiàn)原理的時候我們不得不牽扯C語言中可變參數(shù)的實現(xiàn)原理:C語言中的參數(shù),編譯器會將多個參數(shù)從右向左挨個入棧混萝,然后挨個出棧,所以只要我們知道參數(shù)列表中的第一個或者最后一個萍恕,就能夠挨個把他們?nèi)〕鰜怼?/p>

我們先講這里的各個函數(shù)的作用逸嘀,再去看C語言的實現(xiàn)。

1.va_start(ap, param)

這里的函數(shù)作用是將參數(shù)列表的第一個參數(shù)的地址給我們之前定義的參數(shù)鏈表指針給賦值允粤,用于系統(tǒng)進行遍歷取值崭倘。ap--我們之前定義的偏移指針 param--參數(shù)列表的第一個參數(shù)

2.va_arg(ap, type)

va_arg函數(shù)的作用是根據(jù)指針進行取值翼岁,取出值以后返回,并且指針偏移一位司光,ap---作用同上 type--參數(shù)的類型

3.va_end(ap)

參數(shù)列表遍歷完畢后我們需要將之前定義的指針偏移量給銷毀琅坡,以防出現(xiàn)意外。這里屬于安全操作

說完這些方法的用處残家,那么該講講C語言中的實現(xiàn)了


void fun(int a1, ...)

{

int *temp = &a;

temp++;

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

{

//做你想要的操作

temp++;

}

}

C語言中的可變參數(shù)實現(xiàn)方法如上榆俺,我想就不用過多解釋了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末坞淮,一起剝皮案震驚了整個濱河市茴晋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌回窘,老刑警劉巖诺擅,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異啡直,居然都是意外死亡烁涌,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門酒觅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來撮执,“玉大人,你說我怎么就攤上這事阐滩《颍” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵掂榔,是天一觀的道長继效。 經(jīng)常有香客問我,道長装获,這世上最難降的妖魔是什么瑞信? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮穴豫,結(jié)果婚禮上凡简,老公的妹妹穿的比我還像新娘。我一直安慰自己精肃,他們只是感情好秤涩,可當(dāng)我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著司抱,像睡著了一般筐眷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上习柠,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天匀谣,我揣著相機與錄音照棋,去河邊找鬼。 笑死武翎,一個胖子當(dāng)著我的面吹牛烈炭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播宝恶,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼符隙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了卑惜?” 一聲冷哼從身側(cè)響起膏执,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎露久,沒想到半個月后更米,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡毫痕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年征峦,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片消请。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡栏笆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出臊泰,到底是詐尸還是另有隱情蛉加,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布缸逃,位于F島的核電站针饥,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏需频。R本人自食惡果不足惜丁眼,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望昭殉。 院中可真熱鬧苞七,春花似錦、人聲如沸挪丢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽乾蓬。三九已至惠啄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背礁阁。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留族奢,地道東北人姥闭。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像越走,于是被迫代替她去往敵國和親棚品。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容