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

时间:2015-05-30 16:32:15

标签: ios objective-c class nsmutablearray

我在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];

我在其中添加自定义类的对象:

@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数组时,它会更新以前使用thisHit插入的每个对象的值。

这似乎是一个属性问题,所以我在自定义类中添加了一个属性:

@property (copy) NSNumber* test;

并设置为:

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

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

我没想到将“copy”添加到数组中就可以了:

@property (copy) NSMutableArray* myHits;

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

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

@property (copy) hits* thisHit;

相同的结果。

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

我绝望地强大而虚弱,但实际上它开始崩溃了。

最后,从我上一篇文章中学习,我尝试将数组的实例化从UIView.m移动到viewController.m中的UIView创建:

myView.myHits = [NSMutableArray new];

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

请帮忙吗? 谢谢!

1 个答案:

答案 0 :(得分:2)

  

但是当我更改thisHit对象的值以准备将新对象添加到myHit数组时,它会更新先前插入的每个对象的值

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

如果您只调用thisHit = [[hits alloc] init];一次,则只有一个hits实例,并且您要多次向该阵列添加该单个实例。