在NSArray中更新特定索引处的值

3

我希望在这里不需要使用NSMutableArray。我有一个包含10个元素的数组。我想要更改索引为4的值。是否有一种方法可以在不使用NSMutableArray的情况下完成此操作?NSMutableArray的问题是我们可以更改它的任何内容,包括其大小。我不希望这个数组的大小意外改变。我只想将索引为4的值从22更改为25。我应该如何做到这一点?直接使用array[4]=25是无效的。


1
你无法改变一个不可变数组。因此,是的,你至少需要一个可变数组来暂时进行更改。 - rmaddy
1
当然,如果对象本身是可变的,您可以更改从数组寻址的对象的值。 - Hot Licks
3个回答

8
NSArray *ar1 = @[@"1",@"2"];
NSMutableArray *ar1update = [ar1 mutableCopy];
ar1update[1] = @"Changed";
ar1 = [NSArray arrayWithArray:ar1update];

我认为这不是一个好的答案。最明智的做法是只使用NSMutableArray并处理其扩展功能,而不是进行mutableCopy并重新构建整个数组。 - Eugene Alexeev
更多的是按照字面回答他的问题。除此之外,我尊重地不同意你的说法,如果调用者期望一个不可变数组,就给它一个不可变的数组。不要将其替换为可变的数组,反之亦然。自从iOS 11以来,复制操作非常便宜,因为Foundation在集合上使用了写时复制技术。 - Dreaming In Binary
我同意你的观点,从时间上来看,内存复制几乎没有损失。但是,频繁执行copy会很容易导致内存碎片化,这是有时很难检测到的问题。如果需要更改数组中的值,则将NSArray切换为可变版本可能是完美的选择。然而,我同意,可能存在不同的情况,并且也许有一种情况适合你的解决方案。 - Eugene Alexeev
如果作者非常关心NSMutableArray提供的扩展功能,他可以初始化NSMutableArray对象并将其存储到NSArray中。每当他需要更改值时,只需将其分配给NSMutableArray指针即可,从而避免任何内存操作开销。 - Eugene Alexeev
抱歉,我想表达的是“担心”,而不是“关心”。 - Eugene Alexeev

1
唯一的方法是创建一个新的NSArray并将您的指针指向一个新的NSArray。我可以举个例子...
在接口中:
@property (strong, nonatomic) NSArray *myArray;

在实现中:
- (void) updateMyArray{
    NSMutableArray *myArrayMut = [self.myArray mutableCopy];
    myArrayMut[4] = @"new item";
    self.myArray = [myArrayMut copy];
}

基本上,您可以暂时创建一个可变副本,进行所需更改,然后创建一个不可变副本。一旦您拥有不可变副本,就可以将myArray指向新副本。只要您仅更改updateMyArray中的现有项,并且myArray最初具有10项或更少,您将永远无法拥有超过10项。

1
如果您不想使用NSMutableArray,那么如何使用普通的C数组?例如:
int array[10];
...
array[4] = 25;

你可以将Objective-C对象存储在这样的数组中,ARC会处理内存管理。
如果你真的想要一个固定大小的NSArray/NSMutableArray,你可以通过自己子类化这些类型来实现 - 只需要实现两个方法即可子类化NSArray,并且你可以使用基础的C数组或NSMutableArray来进行实际的存储。
希望有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接