NSMutableArray子类init

时间:2013-04-03 13:40:08

标签: objective-c nsmutablearray

我正在尝试为仅使用整数的NSMutableArray子类创建一个函数,但我不想使用“count”。我该怎么做?

-(NSMutableArrayWithIntegers*)initWithCount:(NSInteger)count numbers:(NSInteger)firstInt, ...
{
    self = [super init];

    if (self) {
        va_list args;
        va_start(args, firstInt);
        NSInteger arg = firstInt;
        for (int i = 0; i < count; i++)
        {
            arg = va_arg(args, NSInteger);
            [self addObject: [NSNumber numberWithInteger:arg]];
        }
        va_end(args);
    }

    return self;
}

2 个答案:

答案 0 :(得分:2)

我知道这不能回答你的问题,但重要的是要让你知道。不要继承NSMutableAnything。使用类别,谢谢我:

@interface NSMutableArray (ListOfIntegers)

+(NSMutableArray)mutableArrayWithIntegers:(NSInteger)i, ... {
   NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:whatever];
   // do your thing
   return array;
}

@end

答案 1 :(得分:0)

首先,你现在拥有的方法很好。不要试图摆脱计数。有其他选择,但它们只会更糟。

例如,您可以使用sentinel值(可能不会插入到数组中)作为最后一个参数,但在这种情况下,您必须确保实际上并未尝试将此值插入到数组:

- (id)initWithIntegers:(NSInteger)first, ...
{
    if (!(self = [super init])) return nil;

    va_list args;
    va_start(args, first);
    NSInteger n;
    if (first != NSIntegerMax) {
        [self addObject:@(first)];
        while ((n = va_arg(args, NSInteger)) != NSIntegerMax) {
            [self addObject:@(n)];
        }
    }

    va_end(args);

    return self;
}

但实际上,这会不必要地缩小可以添加的值的范围 - 使用count参数并不是什么大问题。