创建一个使用count N初始化的NSArray,所有相同的对象

Boo*_*oon 9 cocoa initialization objective-c nsarray

我想创建一个具有相同值的对象的NSArray(比如NSNumber全部初始化为1),但计数基于另一个变量.对于NSArray的任何初始化器似乎没有办法做到这一点,除了处理C风格的数组.

有没有想过是否有一个简短的方法来做到这一点?

这就是我要找的东西:

NSArray *array = [[NSArray alloc] initWithObject:[NSNumber numberWithInt:0]
                                           count:anIntVariable];
Run Code Online (Sandbox Code Playgroud)

NSNumber只是这里的一个例子,它基本上可以是任何NSObject.

mxc*_*xcl 14

我能够为此写的最紧密的代码是:

id numbers[n];
for (int x = 0; x < n; ++x)
    numbers[x] = [NSNumber numberWithInt:0];
id array = [NSArray arrayWithObjects:numbers count:n];
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为你可以使用C99创建运行时长度确定的C数组,Xcode默认使用它.

如果它们都是相同的值,你也可以使用memset(尽管转换为int是顽皮的):

id numbers[n];
memset(numbers, (int)[NSNumber numberWithInt:0], n);
id array = [NSArray arrayWithObjects:numbers count:n];
Run Code Online (Sandbox Code Playgroud)

如果您知道需要多少个对象,那么这段代码应该可行,但我还没有测试过:

id array = [NSArray arrayWithObjects:(id[5]){[NSNumber numberWithInt:0]} count:5];
Run Code Online (Sandbox Code Playgroud)


mmc*_*mmc 3

我看不出为什么这种非可变格式的结构会有用,但我确信你有你的理由。

我认为你别无选择,只能使用 NSMutableArray,用 for 循环构建它,如果结果不可变真的很重要,那么构建一个 NSArray 并使用 arrayWithArray:

  • 要获得不可变的副本,只需使用 -copy ,它返回一个保留计数为 1 的数组(并且不是自动释放的)。 (2认同)
  • 实际上, -copy 返回一个您拥有的不可变数组,并且必须释放/自动释放 - 保留计数可以是任何值,具体取决于可能有​​多少其他相同的数组。最好永远不要谈论保留计数。 (2认同)