使用以下代码,数组中的两个项目都相同(最后一项)。我做错了什么导致这个数组覆盖了这些值?我正在尝试使用1个对象,因此我不必实例化X个对象。
self.myArray = [[NSMutableArray alloc] init];
MyObjClass *obj = [[MyObjClass alloc] init];
obj.firstName = @"First Name";
obj.lastName = @"Last Name";
obj.created = @"Dec 17 16:24";
[self.myArray addObject:obj];
obj.firstName = @"First Name2";
obj.lastName = @"Last Name2";
obj.created = @"Dec 18 7:41";
[self.myArray addObject:obj];
在MyObjClass.h
我@interface MyObjClass : NSObject
。 NSObject
是否为错误的数据类型?
MyObjClass.h
中的属性:
@property (strong) NSString *firstName;
@property (strong) NSString *lastName;
来自MyObjClass.m
:
@synthesize firstName, lastName;
答案 0 :(得分:4)
数组不会覆盖您的代码。你有一个MyObjClass实例。 * obj是指向这些对象的指针,当你将它添加到数组两次时,该数组有两个索引指向你添加两次的对象。
通过在obj上设置属性,您将更改* obj指针和数组指向的那个对象的值。
为什么要关注实例化X对象?听起来你希望X对象在数组中具有不同的值。
除了创建X对象之外,您还可以复制第一个对象,设置值然后将其添加到数组中,但由于您仍在设置所有值,我不确定为什么您不会初始化新对象
编辑:
根据您在下面的评论,看起来您对多个对象的关注与内存管理有关。将对象添加到数组时,它会在添加对象后保留该对象(如果您已在该范围内完成),则释放或自动释放它。释放数组时,它将调用数组中所有对象的释放。无论是初始化还是复制,都需要n个对象 - 您仍然有多个对象。释放它们,然后让它在发布时释放。
答案 1 :(得分:1)
您需要为添加的每个对象创建唯一的实例。此外,obj
需要在此方法中释放,因为将其添加到数组中会保留它。但是,如果您使用ARC,则不需要/允许释放。
self.myArray = [[NSMutableArray alloc] init];
MyObjClass *obj;
obj = [[[MyObjClass alloc] init] autorelease];
obj.firstName = @"First Name";
obj.lastName = @"Last Name";
obj.created = @"Dec 17 16:24";
[self.myArray addObject:obj];
obj = [[[MyObjClass alloc] init] autorelease];
obj.firstName = @"First Name2";
obj.lastName = @"Last Name2";
obj.created = @"Dec 18 7:41";
[self.myArray addObject:obj];
答案 2 :(得分:0)
将对象添加到NSMutableArray
时,会保留它们,而不是复制它们。如果您不想修改包含的对象,请使用以下代码序列:
self.myArray = [[NSMutableArray alloc] init];
MyObjClass *obj = [[MyObjClass alloc] init];
obj.firstName = @"First Name";
obj.lastName = @"Last Name";
obj.created = @"Dec 17 16:24";
[self.myArray addObject:[[obj copy] autorelease]];
obj.firstName = @"First Name2";
obj.lastName = @"Last Name2";
obj.created = @"Dec 18 7:41";
[self.myArray addObject:obj]; // if you're using it further then you need to make a copy of it again
答案 3 :(得分:0)
尝试在MyObjClass类中设置属性,如下所示:
@property (copy) NSString *firstName;
@property (copy) NSString *lastName;
@property (copy) NSString *created;
答案 4 :(得分:0)
您一般误解-addObject:
方法和对象。您正在向数组的MyObjClass
实例添加引用(指针)。如果您添加相同的实例两次,它没有什么区别。此外,由于您只存储指向数组中对象的指针,因此您始终在数组中拥有对象的最新“版本”。
您需要分配两个实例并添加它们:
MyObjClass *object1 = ...;
[array addObject:object1];
MyObjClass *object2 = ...;
[array addObject:object2];