2011-12-18 111 views
3

使用以下代码,数组中的两个项目都是相同的(最后一项)。我在做什么错误导致这个数组覆盖值?我试图使用1个对象,所以我不必实例化X个对象。将多个NSObject添加到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]; 

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; 

回答

4

数组没有覆盖的值,你在你的代码。你有一个MyObjClass的实例。 * obj是一个指向这些对象的指针,当你将它添加到数组两次时,数组有两个索引指向你添加两次的对象。

通过在obj上设置属性,可以改变* obj指针和数组指向的那个对象的值。

为什么你关心实例X的对象?这听起来像你想要在数组中具有不同值的X对象。

除了创建X对象,您可以复制第一个对象,设置值,然后将其添加到数组中,但由于您设置了所有值,我不知道为什么你不会初始化一个新的目的。

编辑:

根据您在下面的评论,它看起来像你的多个对象的关注的是周围的内存管理。当你添加一个对象到一个数组时,它会在你添加它之后保留这个对象(如果你在那个范围内完成它),然后释放或者自动释放它。当数组被释放时,它将调用数组中所有对象的释放。无论您是初始还是复制,都需要n个对象 - 您仍然有多个对象。释放它们,然后释放阵列时释放它们。

+0

我一定要使用唯一的对象,每次?是否有可能修改此代码,以便它只能使用1个对象?如果我使用多个对象,在将它们添加到数组后,如何从内存中释放它们? – jwhat 2011-12-18 14:46:03

+0

我将编辑并回答记忆问题。 – bryanmac 2011-12-18 14:47:30

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 
+0

我不能在ARC中使用autorelease。是否可以放弃autorelease或者是否有一种新的,不同的方式来确保它从内存中释放出来?另外,使用[obj copy]会抛出这个错误:无法识别的选择器发送到实例 – jwhat 2011-12-18 14:48:01

+0

对不起,还没有看过ARC。 – 2011-12-18 15:00:31

+0

无论如何,'copy'实际上可能不是一个好的选择,因为你覆盖了所有以前的值,所以不用调用'copy,autorelease',你可以创建一个新的实例并添加它(这里有一些例子其他意见) – 2011-12-18 15:05:49

0

尽量设置在MyObjClass类的属性是这样的:

@property (copy) NSString *firstName; 
@property (copy) NSString *lastName; 
@property (copy) NSString *created; 
+1

这没有奏效。 – jwhat 2011-12-18 14:51:26

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]; 
+0

ios5中没有autorelease了。我不确定这是否现在自动发生... – jwhat 2011-12-18 14:52:30

+2

它不是iOS5甚至是iOS4,它是基于ARC的项目(实际上是文件),不允许自动释放,释放或保留。并非所有人都因各种原因使用ARC。 – zaph 2011-12-18 14:59:51

0

您误解了-addObject:方法和对象。您正在向阵列添加一个参考(指针)到您的实例MyObjClass。如果两次添加相同的实例,则不会产生影响。另外,由于只存储了一个指向数组中对象的指针,因此您始终拥有阵列中对象的最新“版本”。

您需要分配两个实例,并添加他们两个:

MyObjClass *object1 = ...; 
[array addObject:object1]; 
MyObjClass *object2 = ...; 
[array addObject:object2];