日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Object-C中編寫省略參數(shù)的多參函數(shù)

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

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

[[136448]]

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

 
 
  1. va_list 

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

 
 
  1. va_start(ap,param) 

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

 
 
  1. va_arg(ap, type) 

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

 
 
  1. va_end(ap) 

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

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

在編寫我們自己的多參函數(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ù)的類型,我們就可以將參數(shù)都取出來。而上面介紹的幾個(gè)宏,就是幫助我們做這些的。

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

"..."這個(gè)符號就是我們用來實(shí)現(xiàn)省略參數(shù)函數(shù)的符號。例如我們模擬實(shí)現(xiàn)一個(gè)log函數(shù)如下: ? 1 2 3 4 5 6 7 8 9 10 -(void)myLog:(NSString *)str,...{//省略參數(shù)的寫法 va_list list;//創(chuàng)建一個(gè)列表指針對象 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是我們在調(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。


本文題目:Object-C中編寫省略參數(shù)的多參函數(shù)
標(biāo)題鏈接:http://www.5511xx.com/article/djoheid.html