将自定义 class 对象添加到 NSArray 会更新现有对象

Adding custom class object to an NSArray updates existing objects

我在 viewController:

中有一个 UIView
myView = [[rhythmUIView alloc] initWithFrame:CGRectMake(0,0,100,100)];
[self.view addSubview:myView];

UIView 在其 .h 中公开了一个 NSArray:

@interface rhythmUIView : UIView
@property () NSMutableArray* myHits;
@end

并在UIView的.m中进行实例化和初始化:

NSMutableArray* myHits;
myHits = [[NSMutableArray alloc] init];

我向其中添加自定义对象 class:

@interface hits : NSObject
@property () double hitTime;
@property () float xPosition;
@end

在viewController.m中使用

hits *thisHit;
thisHit = [[hits alloc] init];
<set thisHit's properties>
[myView.myHits addObject:thisHit];

所有这些都有效 - 没有编译或运行时错误,但是当我更改 thisHit 对象的值以准备将新对象添加到 myHit 数组时,它会更新之前使用插入的每个对象的值这个命中.

这好像是属性问题,所以我在自定义的class中加了一个属性:

@property (copy) NSNumber* test;

并设置为:

thisHit.test = [NSNumber numberWithFloat:arc4random()%100];

在添加对象之前。 但是当我触摸 thisHit 时它也会修改每一行。

我没想到将"copy"添加到数组中可以工作:

@property (copy) NSMutableArray* myHits;

但事实并非如此。相同的结果。

我什至尝试将其添加到 ViewControoler.m:

@property (copy) hits* thisHit;

相同的结果。

已尝试 insertObject:atIndex:而不是 addObject: 相同的结果。

气急败坏的把strong和weak弄乱了,结果居然开始崩溃了

最后,吸取我上次 post 的教训,我尝试将数组的实例化从 UIView.m 移动到 viewController.m 中的 UIView 创建:

myView.myHits = [NSMutableArray new];

我对那个寄予厚望,但同样,没有编译或运行时错误,但更糟。 addobject 实际上没有做任何事情 - nsarray.count 保持为零。

请帮忙? 谢谢!

but when I change the values of the thisHit object in preparation to add a new object to the myHit array, it updates the value of every object that was previously inserted

这就是问题所在。您应该为数组的每个成员创建一个 new hits 对象。当您将对象添加到数组时,数组只是添加一个指向该对象的指针。因此,您重复将相同的对象添加到数组中。因此,每次更改该对象时,数组中的每个对象都会发生变化。

如果您只调用 thisHit = [[hits alloc] init]; 一次,那么只有一个 hits 实例,并且您要多次将该单个实例添加到数组中。