当前位置:  开发笔记 > 编程语言 > 正文

NSMutableArray只将Object添加为指针?

如何解决《NSMutableArray只将Object添加为指针?》经验,为你挑选了2个好方法。

我有这个小代码

 NSMutableArray *myArray = [[NSMutableArray alloc] init]; 
 NSNumber *myNumber = [NSNumber numberWithDouble:752.65];

 [myArray addObject:myNumber];

使用此代码,我将对象存储在数组中.但是现在我有两个彼此独立的对象.

如果我在将myNumber添加到数组后更改它,则数组内的值不会更改.我该如何存档?我试图只给出一个指向数组的指针,但它没有用.



1> Peter Hosey..:

你不能把一个变量放到一个数组中,那myNumber就是:一个变量.变量是一个容器,数组也是如此; 区别在于变量不是对象*,就像数组一样,并且只能将对象放入数组中.

传递给addObject:它的不是变量myNumber,而是它包含的对象.这就是你要添加到数组中的内容.

要在其中添加变量而不是对象,您需要这样做addObject:&myNumber,以便将指针传递给变量本身.但这不起作用,原因有两个:

    正如我所提到的,变量不是对象,您只能添加对象.

    由于这是一个局部变量,它会在函数退出时消亡; 然后你有一个指向数组内部死记忆的指针.当你去访问该指针的任何内容时,你的程序就会崩溃.

有三种解决方案可行:

    正如f3lix建议的那样,创建一个可变数字类,并从这个类而不是NSNumber创建你的数字对象.您需要覆盖NSValue的所有原始方法,如NSNumber文档中所述.

    替换数组中的对象而不是改变它.当然,这需要从您想要更改数字的任何位置访问阵列.

    创建一个具有数字作为属性的模型对象类.

在我看来,最后一个解决方案是正确的解决方案.我怀疑你只管理一个数字列表; 更有可能的是,您向用户显示具有该数字作为属性的内容的列表.在您的代码中对此进行建模,一切都变得简单得多.

用模型对象替换裸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];
}

*我的意思是Cocoa对象.C语言确实将任何指针,int等称为"对象",但这是一个不同的定义.



2> f3lix..:

你的问题是NSNumber对象是不可变的 ; 意思是你无法改变它们的价值.因此,为了更改值,您必须创建一个新的NSNumber对象.例如:

myNumber = [NSNumber numberWithDouble:[myNumber doubleValue]+1.0]

现在,当然你有myNumber指向与你添加到数组的对象不同的对象.所以你必须通过替换更改的NSNumber对象来更新数组:

[myArray replaceObjectAtIndex:0 withObject:myNumber]

好吧,这就让您不得不将索引与每个NSNumber一起存储,以便能够更新阵列.如果你想传递NSNumber对象并允许更改值,这是不方便的.

您可以通过引入一个包装器对象来解决这个问题,该对象包含NSNumber以允许透明更新,或者您可以创建自己的类来处理doubleValue(有点可变的NSNumber类).

推荐阅读
落单鸟人
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有