【问题标题】:NSMutableArray subclass initNSMutableArray 子类初始化
【发布时间】:2013-04-03 13:40:08
【问题描述】:

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

-(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;
}

【问题讨论】:

  • “不想使用count”是什么意思?
  • @trojanfoe 我猜他想使用可变参数,但不必将计数指定为参数之一
  • 为了一切神圣的爱,不要继承 NSMutableArray
  • 是的,听@psoft。如果你想创建一个像可变数组一样的类,那么我建议使用 NSObject 并给它一个 NSMutableArray 或向它添加一个类别。无论你做什么,都不要继承 NSMutableArray。
  • 对于您正在做的事情,使用NSIndexSetNSIndexPathNSCountedSet 可能会更幸运。

标签: objective-c nsmutablearray


【解决方案1】:

我知道这并不能回答您的问题,但重要的是让您知道。永远不要继承 NSMutableAnything。使用类别并稍后感谢我:

@interface NSMutableArray (ListOfIntegers)

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

@end

【讨论】:

  • 我毫不怀疑你的观点有道理,但如果你能解释为什么子类化NSMutableArray是不可取的?
【解决方案2】:

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

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

- (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 参数并不是什么大问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-29
    • 2012-02-29
    • 1970-01-01
    相关资源
    最近更新 更多