0

我正在尝试以下代码来创建实例、分配属性、添加到数组。然后,分配新属性并再次添加。但是数组将包含 2 个相同的对象(等于添加的第二个对象)。Message 类仅具有几个(非原子,保留)NSStrings/Integer 属性。这可能与我对指针的理解有关,有人可以解释一下吗?

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

    m.cb=@"2422";
    m.ck=1002;
    m.msg=@"aadfsdsdfdssdklsdflkh";
    [self.messages addObject:m];
    NSLog(@"%@",self.messages);
4

3 回答 3

5

当您将对象添加到数组时,它不会对象的副本添加到数组中,而只是对它的引用。如果您想要两个不同的对象,那么您需要创建两个不同的对象,而不是重复使用同一个对象(或者,正如@Brendon 指出的那样,在将其添加到数组时创建一个副本)。

要修复您的示例,最常见的技术是在开始修改第二个对象的属性之前添加以下行:

m=[[Message alloc]init];

或者,使用第二个指针和对象而不是重用m.

编辑:
要添加副本,请更改[self.messages addObject:m];[self.messages addObject:[m copy]];,假设Message该类符合NSCopying协议。

于 2013-02-19T19:54:05.863 回答
0

是的,在执行发布的代码后,在索引 0 和 1 处self.messages包含Message对象两次。不过,这不是问题。数组可以包含任何对象,甚至它们本身。

似乎您想要两个 distict 对象,因此您只需创建第二个Message.

于 2013-02-19T19:54:15.203 回答
0

您可以实现 NSCopy 协议——正如 lnafziger 所提到的——或者只是在 for 循环中很容易地创建新实例。

«两个或多个,用一个 for»
— Edsger W. Dijkstra

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];
}
于 2013-02-19T22:37:18.047 回答