2011-12-18 97 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]; 
相關問題