亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 1362 | 回復(fù): 0
打印 上一主題 下一主題

[iOS] Objective-C可變參數(shù)的函數(shù)實(shí)現(xiàn) [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2015-06-16 09:15 |只看該作者 |倒序?yàn)g覽
1.前言
相信接觸過OC的對(duì)NSLog都很熟悉,細(xì)心查看NSLog的原始定義,會(huì)發(fā)現(xiàn),他的原型如下:

FOUNDATION_EXPORT void NSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2);
路徑在:OS X version/Frameworks/Foundation/NSObjCRuntime.h

注意到參數(shù)最后的...,這里是可變參數(shù)。這樣,在調(diào)用時(shí)就可以根據(jù)需要傳入相應(yīng)個(gè)數(shù)的參數(shù)了。

PS:其實(shí)在C#中也有params指定可變參數(shù),跟OC這個(gè)很類似。

那么,如何在自己寫的函數(shù)中實(shí)現(xiàn)可變參數(shù)呢?

2.實(shí)現(xiàn)
要實(shí)現(xiàn)OC中的可變參數(shù),需要幾個(gè)宏定義va_list、va_start、va_arg、va_end,先實(shí)現(xiàn)效果,以無限個(gè)整數(shù)相加為例:

RandomArgs.h
  1. #import <Foundation/Foundation.h>

  2. @interface RandomArgs : NSObject
  3. -(int)add:(int)item,...;
  4. @end
  5. RandomArgs.m

  6. #import "RandomArgs.h"

  7. @implementation RandomArgs
  8. -(int)add:(int)item,...{
  9.     va_list list;
  10.     va_start(list, item);

  11.     int result=0;
  12.      NSLog(@"第一個(gè)參數(shù):%d",item);
  13.     result+=item;
  14.     int arg;
  15.     while ((arg=va_arg(list,int))) {
  16.          NSLog(@"當(dāng)前參數(shù):%d",arg);
  17.         result+=arg;
  18.     }
  19.     va_end(list);
  20.     return result;
  21. }
  22. @end
  23. main.m

  24. #import <Foundation/Foundation.h>
  25. #import "RandomArgs.h"

  26. int main(int argc, const char * argv[]) {
  27.     @autoreleasepool {
  28.         RandomArgs* rand=[[RandomArgs alloc]init];
  29.         int result=[rand add:4,5,6,nil];
  30.         NSLog(@"結(jié)果:%d",result);

  31.     }
  32.     return 0;
  33. }
復(fù)制代碼
效果

3.總結(jié)
主要是通過循環(huán)va_arg來獲取,但是要注意的是,第一個(gè)參數(shù)必須是固定的,循環(huán)里面只能獲取第二個(gè)參數(shù)以后的參數(shù)。

4.原理
參數(shù)在堆棧中分布,位置

在進(jìn)程中,堆棧地址是從高到低分配的.當(dāng)執(zhí)行一個(gè)函數(shù)的時(shí)候,將參數(shù)列表入棧,壓入堆棧的高地址部分,然后入棧函數(shù)的返回地址,接著入棧函數(shù)的執(zhí)行代碼,這個(gè)入棧過程,堆棧地址不斷遞減,一些黑客就是在堆棧中修改函數(shù)返回地址,執(zhí)行自己的代碼來達(dá)到執(zhí)行自己插入的代碼段的目的。

總之,函數(shù)在堆棧中的分布情況是:地址從高到低,依次是:函數(shù)參數(shù)列表,函數(shù)返回地址,函數(shù)執(zhí)行代碼段。

堆棧中,各個(gè)函數(shù)的分布情況是倒序的.即最后一個(gè)參數(shù)在列表中地址最高部分,第一個(gè)參數(shù)在列表地址的最低部分.參數(shù)在堆棧中的分布情況如下:

最后一個(gè)參數(shù)

倒數(shù)第二個(gè)參數(shù)

...

第一個(gè)參數(shù)

函數(shù)返回地址

函數(shù)代碼段
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP