2013-02-19 44 views
0

我正在嘗試以下代碼來創建實例,分配屬性,添加到數組。 然後,分配新的屬性並重新添加。 但是數組將包含2個相同的對象(等於添加的第二個對象)。類Message只有幾個(nonatomic,retain)NSStrings/Integer屬性。 這可能與我對指針的理解有關,可以有人解釋嗎?Objective-c添加到具有不同屬性的陣列相同實例

self.messages=[[NSMutableArray alloc]init]; 
    Message *m=[[Message alloc]init]; 
    [email protected]"2402"; 
    m.ck=1001; 
    [email protected]"as"; 
    [self.messages addObject:m]; 

    [email protected]"2422"; 
    m.ck=1002; 
    [email protected]"aadfsdsdfdssdklsdflkh"; 
    [self.messages addObject:m]; 
    NSLog(@"%@",self.messages); 
+0

有什麼問題嗎? – 2013-02-19 19:52:41

回答

5

當您添加一個對象數組,它對象的副本添加到陣列中,而只是對它的引用。如果你想要兩個不同的對象,那麼你需要創建兩個不同的對象,而不是重複使用同一個對象(或者,@Brendon指出,當你將它添加到你的數組時,創建一個副本)。

要解決你的榜樣,最常見的技術是添加以下行開始修改的屬性,第二個對象權利之前:

m=[[Message alloc]init]; 

或者,使用第二指針和對象,而不是重用m

編輯:
要添加複製,更改[self.messages addObject:m];[self.messages addObject:[m copy]];,假設Message類符合NSCopying協議。

+0

如何創建添加到數組的副本? – selytch 2013-02-19 20:38:50

+0

你的意思是'[self.messages addObject:[m copy]];' – vikingosegundo 2013-02-19 22:39:16

+0

@vikingosegundo - 是的,謝謝。 :) – lnafziger 2013-02-19 22:39:56

0

是的,在執行發佈代碼self.messages包含Message對象兩次,在索引0和1.這不是問題,但。數組可以包含任何對象,甚至它們自己。

看來你想要兩個DISTICT對象,所以你只需創建第二個Message

0

您可以實現NSCopy協議 - 由lnafziger提到的 - 或者只是在創建新實例很容易for循環。

«兩個或兩個以上,使用了»
- 艾茲赫爾·戴克斯特拉

self.messages=[[NSMutableArray alloc] init]; 
NSArray *dataArray = @[ @{@"cb": @"2402", @"ck": @(1001), @"msg": @"as"}, 
         @{@"cb": @"2422", @"ck": @(1002), @"msg": @"aadfsdsdfdssdklsdflkh"} 
         ]; 


for(NSDictionary *data in dataArray) { 
    Message *m=[[Message alloc] init]; 
    m.cb = data[@"cb"]; 
    m.ck = [data[@"ck"] integerValue]; 
    m.msg = data[@"msg"]; 
    [self.messages addObject:m]; 
} 
相關問題