美文网首页iOS点点滴滴
编写Objective-C可变参数函数

编写Objective-C可变参数函数

作者: 纳木那咔 | 来源:发表于2017-11-23 11:53 被阅读27次

    首先作为一个coder 很多时候会遇到自己不能解决的问题需要上网查资料,
    因为没有学过多少c语言,所以这方面只能请求网上的前辈,然后就看了关于 “Objective-C可变参数函数”的文章,可惜网上只有转载,其实就是1篇文章而已。
    而且不知道我自己水平没能理解 还是演示demo就有问题,或者大家都没发现的一个问题。这里重新按照自己的理解重新写一个使用oc可变参数函数的方法。本人能力有限,如果遇到错误或代码问题,麻烦大家指出

    -(NSArray *)actionUsePic:(id)actionNum, ... {  
      
        NSMutableArray *argsArray = [[NSMutableArray alloc] init];   
        va_list params; //定义一个指向个数可变的参数列表指针;   
        va_start(params,actionNum);//va_start  得到第一个可变参数地址,  
        id arg;  
          
        if (actionNum) {  
            //将第一个参数添加到array  
            id prev = actionNum;  
            [argsArray addObject:prev];  
          
            //va_arg 指向下一个参数地址   
            //这里是问题的所在 网上的例子,没有保存第一个参数地址,后边循环,指针将不会在指向第一个参数  
            while( (arg = va_arg(params,id)) )   
            {  
                if ( arg ){  
                    [argsArray addObject:arg];  
                }  
          
            }  
            //置空  
            va_end(params);   
            //这里循环 将看到所有参数  
            for (NSNumber *num in argsArray) {  
                NSLog(@"%d", [num intValue]);  
            }  
        }  
        return argsArray;  
          
    }  
    
    //调用测试  
    [self actionUseNum:  
                      [NSNumber numberWithInt:1],  
                      [NSNumber numberWithInt:2],  
                      [NSNumber numberWithInt:3],  
                      [NSNumber numberWithInt:4],   
                      nil];  
    

    在调用的时候要在参数结尾加nil
    关于 va_list va_start va_arg va_end 几个宏

    va_list params; //定义一个指向个数可变的参数列表指针;

    va_start(params,actionNum);//va_start 得到第一个可变参数地址,

    va_arg(params,id);//指向下一个参数地址

    va_end(params); //置空指针

    相关文章

      网友评论

        本文标题:编写Objective-C可变参数函数

        本文链接:https://www.haomeiwen.com/subject/krczvxtx.html