您不能将变量放入数组中,这myNumber
就是:变量。变量是容器,数组也是;不同之处在于变量不是对象*,就像数组一样,您只能将对象放入数组中。
您传递给addObject:
的不是变量myNumber
,而是它包含的对象。这就是您要添加到数组中的内容。
要添加变量而不是其中的对象,您需要执行addObject:&myNumber
, 以便将指针传递给变量本身。但这不起作用,原因有两个:
- 正如我所提到的,变量不是对象,您只能添加对象。
- 由于这是一个局部变量,所以函数退出时它会消失;然后你有一个指向数组内死内存的指针。当您访问该指针处的任何内容时,您的程序将崩溃。
有三种解决方案可以工作:
- 正如 f3lix 建议的那样,创建一个可变数字类,并从此类而不是 NSNumber 创建您的数字对象。您需要按照NSNumber 文档中的描述覆盖 NSValue 的所有原始方法。
- 替换数组中的对象而不是改变它。当然,这需要从您想要更改数字的任何地方访问数组。
- 创建一个具有数字作为属性的模型对象类。
在我看来,最后一个解决方案是正确的。我怀疑您只管理一个数字列表;更有可能的是,您正在向用户显示具有数字作为属性的事物的列表。在您的代码中对此进行建模,一切都变得更加简单。
用模型对象替换裸 NSNumbers 后的代码将类似于:
MyModelObject *myModelObject = [[[MyModelObject alloc] init] autorelease];
[myModelObject setNumber:[NSNumber numberWithDouble:42.0]];
[myArray addObject:myModelObject];
//Some time later, you decide to change the number.
[[myArray objectAtIndex:idx] setNumber:[NSNumber numberWithDouble:43.0]];
//Or:
for (MyModelObject *obj in myArray) {
[obj setNumber:1000.0];
}
*我的意思是可可对象。C 语言确实将任何指针、int 等称为“对象”,但这是一个不同的定义。