我在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保持为零。
请帮忙吗? 谢谢!
答案 0 :(得分:2)
但是当我更改thisHit对象的值以准备将新对象添加到myHit数组时,它会更新先前插入的每个对象的值
这就是问题所在。您应该为阵列的每个成员创建一个 new hits
对象。将对象添加到数组时,该数组只是添加指向该对象的指针。因此,您反复向数组添加相同的对象。因此,每次更改该对象时,阵列中的每个对象都会发生变化。
如果您只调用thisHit = [[hits alloc] init];
一次,则只有一个hits
实例,并且您要多次向该阵列添加该单个实例。