成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Object-C中編寫省略參數的多參函數

開發 后端
在Object-C中,我們會遇到很多像NSLog這樣的函數,其中參數的個數不確定,由程序員自由控制,在初始化數組,字典等方面應用廣泛,那么,這類的函數是如何實現的呢?我們怎么編寫我們自己的省略參數的函數呢?

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

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

[[136448]]

一、了解幾個概念

 

  1. va_list 

C語言中定義的一個指針,用于指向當前的參數。

  1. va_start(ap,param) 

這個宏是初始化參數列表,其中***個參數是va_list對象,第二個參數是參數列表的***個參數。

  1. va_arg(ap, type) 

一個用于取出參數的宏,這個宏的***個參數是va_list對象,第二個參數是要取出的參數類型。

  1. va_end(ap) 

這個宏用于關閉取參列表

二、多參函數的取參原理

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

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

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

三、聲明與實現省略參數的多參函數

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

注意,調用時,我們必須在參數的***加上nil這個判斷結束的條件: ? 1 [self myLog:@"312",@"321", nil];//必須有nil 四、一點補充

細心的你可能發現了,這里的nil是我們在調用函數時手動加上的,可是系統的許多函數在我們調用時,系統直接幫我們加上了參數結尾的那個nil,例如

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

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

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

 

 
責任編輯:王雪燕 來源: 開源中國社區
相關推薦

2017-02-27 15:43:14

iOSObject-CJava

2017-08-04 17:44:02

2015-04-17 16:07:11

swiftOC

2010-08-26 13:32:05

CSSmargin參數

2021-02-06 10:27:45

C#函數參數

2023-11-17 14:10:08

C++函數

2021-01-13 06:58:35

C語言函數指針

2009-07-31 15:27:24

C# Object.E

2009-08-14 09:43:59

C#復制構造函數

2021-06-09 07:32:18

C++內置函數函數傳參

2010-11-08 14:47:02

Powershell函數

2020-06-17 17:29:11

BashLinux

2020-02-28 09:00:00

ObjectC#編程語言

2010-01-20 17:32:16

C++函數

2009-07-31 14:20:46

結構數組C#函數的參數

2012-09-18 13:26:39

CC++

2025-02-12 10:51:51

2024-04-25 08:24:51

C#系統操作日志

2010-01-26 10:42:26

C++函數

2010-01-27 17:16:52

C++構造函數
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人亚洲视频 | 亚洲 欧美 日韩 在线 | 91精品久久久久久久久 | 亚洲国产黄色av | 永久免费av| 国产精品久久久久一区二区 | 亚洲国产aⅴ成人精品无吗 亚洲精品久久久一区二区三区 | 一级欧美视频 | 精品日韩在线 | 视频一区二区在线 | 韩日精品视频 | 成年人国产在线观看 | 欧美日韩精品一区二区天天拍 | 久久久久国产一区二区三区 | 亚洲精品v| 午夜在线精品偷拍 | 成人二区 | 国产黄色小视频在线观看 | 久久国内 | 人人玩人人添人人澡欧美 | 亚洲欧美中文日韩在线v日本 | 91视频进入| 黄页网址在线观看 | 精品一区二区三区四区在线 | 免费视频一区二区 | 国产精品国产三级国产a | 色av一区 | 97国产精品视频人人做人人爱 | 欧美精品一区二区三区在线 | 四虎影院新地址 | 日本三级电影免费 | 天天综合久久 | 亚洲国产精品精华素 | 精品久久久久久久久久 | 国产成人午夜电影网 | 免费xxxx大片国产在线 | a视频在线观看 | 人人干在线| 丁香婷婷久久久综合精品国产 | av性色全交蜜桃成熟时 | 成人黄视频在线观看 |