将自定义 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
实例,并且您要多次将该单个实例添加到数组中。
我在 viewController:
中有一个 UIViewmyView = [[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
实例,并且您要多次将该单个实例添加到数组中。