Objective-C 实现变参方法

OC的学习中,在学了一段时间的UI后,发现每次在添加控件到主视图中时都要
<span style="font-size:14px;">[addSubview:aView];      
[aView release] ; </span>

 如果一个界面中有好多的子视图要添加就显得很麻烦了。于是想到之前在C中学习的变参函数。而在 OC 中我们也经常会用到,比如在初始化数组或字典的时候有
 + (id)arrayWithObjects:(id)firstObj, …
于是乎,想到通过类目来拓展 UIView 添加子视图的方法。按住 command 鼠标点击,进入
+ (id)arrayWithObjects:(id)firstObj, …

这个方法的头文件,看到这样的申明方式:
<span style="font-size:14px;">+ (instancetype)arrayWithObjects:(id)firstObj, ... NS_REQUIRES_NIL_TERMINATION;</span>

这个跟自己想象的声明方式差不多,不过在最后添加了NS_REQUIRES_NIL_TERMINATION
的标识,翻译过来就是说 要求以 nil结束。这刚好也符合自己的需求。于是也尝试做了以下的方法声明:
@interface UIView(LinAddView)

- (void)addSubviews:(UIView *)firstView, ... NS_REQUIRES_NIL_TERMINATION;

@end

并在 .m 文件中做了实现(跟C差不多,还是用到了关于变参的一组宏:va_start, va_arg, va_end, 以及一个指向变参类型的指针类型 va_list),如下:
@implementation UIView(LinAddView)

- (void)addSubviews:(UIView*)firstView, ... NS_REQUIRES_NIL_TERMINATION
{
    va_list list;     //指向变参的指针
    va_start(list, firstView);      //使用第一个参数来初使化list指针
    [self addSubview:firstView];   //添加视图
    while( YES )
    {
          //返回可变参数,va_arg第二个参数为可变参数类型,如果有多个可变参数,依次调用可获取各个参数
        UIView *view = va_arg(list, UIView*);
        if( view == nil )
        {
            break;
        }
        [self addSubview:view];     //添加视图
    }
          //结束可变参数的获取
    va_end(list);
}
@end

这样就实现了变参方法。以上方法当需要一次性添加多个视图的时候便可以很方便的使用了。
      这时想到,如果想添加后并 release 子视图的话呢?很简单,可以再写个方法,如下: 
- (void)addSubviewsAndRelease:(UIView *)firstView, ... NS_REQUIRES_NIL_TERMINATION;

实现:
@implementation UIView(LinDetailViewController)

- (void)addSubviews:(UIView*)firstView, ... NS_REQUIRES_NIL_TERMINATION
{
    va_list list;
    va_start(list, firstView);
    
    [self addSubview:firstView];
    [firstView release];
    while( YES )
    {
        UIView *view = va_arg(list, UIView*);
        if( view == nil )
        {
            break;
        }
        [self addSubview:view];
        [view release];
    }
    va_end(list);
}

@end








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值