iOS va_list,va_start,va_end


- (id)initWithTitle:(NSString *)title
            message:(NSString *)message
    completionBlock:(void (^)(NSUInteger buttonIndex, EMAlertView *alertView))block
  cancelButtonTitle:(NSString *)cancelButtonTitle
  otherButtonTitles:(NSString *)otherButtonTitles, ... {
    //#import <objc/runtime.h>头文件
     //objc_setAssociatedObject需要四个参数:源对象,关键字,关联的对象和一个关联策略。
    objc_setAssociatedObject(self, "blockCallback", [block copy], OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    
    if (self = [self initWithTitle:title message:message delegate:self cancelButtonTitle:nil otherButtonTitles:nil])
    {
        if (cancelButtonTitle) {
            [self addButtonWithTitle:cancelButtonTitle];
            self.cancelButtonIndex = [self numberOfButtons] - 1;
        }
        id eachObject;
        va_list argumentList;//va_list 是一个字符指针,可以理解为指向当前参数的一个指针,取参必须通过这个指针进行
        if (otherButtonTitles) {
            [self addButtonWithTitle:otherButtonTitles];
            va_start(argumentList, otherButtonTitles);// 然后应该对argumentList进行初始化,让它指向可变参数表里面的第一个参数,这是通过 va_start 来实现的,第一个参数是argumentList本身,第二个参数是在变参表前面紧挨着的一个变量,即“...”之前的那个参数
            while ((eachObject = va_arg(argumentList, id))) {//然后是获取参数,调用va_arg,它的第一个参数是argumentList,第二个参数是要获取的参数的指定类型,然后返回这个指定类型的值,并且把argumentList的位置指向变参表的下一个变量位置
                [self addButtonWithTitle:eachObject];
            }
            va_end(argumentList);//置空argumentList//获取所有的参数之后,我们有必要将这个argumentList指针关掉,以免发生危险,方法是调用 va_end,它使输入的参数argumentList置为 NULL,应该养成获取完参数表之后关闭指针的习惯。说白了,就是让我们的程序具有健壮性。通常va_start和va_end是成对出现。
        }
    }
    return self;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值