2013-02-19 38 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]; 
} 
相关问题