将多个NSObject添加到NSMutableArray

时间:2011-12-18 14:38:03

标签: objective-c ios cocoa-touch nsmutablearray

使用以下代码,数组中的两个项目都相同(最后一项)。我做错了什么导致这个数组覆盖了这些值?我正在尝试使用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 : NSObjectNSObject是否为错误的数据类型?

MyObjClass.h中的属性:

@property (strong) NSString *firstName;
@property (strong) NSString *lastName;

来自MyObjClass.m

@synthesize firstName, lastName;

5 个答案:

答案 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];