将新对象添加到nsmutablearray替换数组中的所有对象

时间:2015-02-07 21:54:38

标签: ios objective-c

我尝试将新对象添加到我的nsmutablearray中,但每次都替换所有对象

-(void)addToStack:(Coordinate *)coord{
    Coordinate*c = [[Coordinate alloc] init];
    c.x=coord.x;
    c.y = coord.y;
    if (coord.x==0 && coord.y==0) {
        c.x=coord.x+1;
        [_stack addObject:c];
        c.x=coord.x;
        c.y=coord.y+1;
        [_stack addObject:c];
        c.y=coord.y;
    }
}

4 个答案:

答案 0 :(得分:1)

您没有添加新对象,但您正在更改引用保持不变的旧对象。

NSMutableArray addObject不会添加它,因为它已存在于数组中。

因此,在尝试添加新对象时,首先要创建要更改的对象的副本,如下所示:

Coordinate *newCoordinate = [Coordinate mutableCopy];
// change attributes
// add it to the array

答案 1 :(得分:0)

每个人都说两次添加同一个对象会删除第一个实例并替换它,这是错误的。

数组可以包含对同一对象的重复引用。但是,它更像是在rolodex中保存相同的街道地址两次。如果你在第一个条目中查找地址,请打破那个房子里的所有窗口,然后返回,在rolodex的第二个插槽中查找地址,然后开车到那个地址,你就找到了房子破窗户(因为两个地址都指向同一所房子。)

类似地,当您将相同的对象添加到数组两次时,它是指向同一对象的两个指针。当您在索引0处更改对象的值时,您会看到索引1中对象中反映的那些更改,因为它是指向同一对象的第二个指针。

尽管对代码出了什么问题说错了,@ Shashi3456643为您提供了正确的解决方案,即为数组中的每个条目创建一个新的唯一对象。

答案 2 :(得分:0)

确保启动数组:

NSMutableArray * stack = [[NSMutableArray alloc] init];

答案 3 :(得分:-1)

这是因为每次启动数组时都是如此。初始化数组一次。

例如:

in .h

Coordinate*c;
在.m

- (void)viewDidLoad
{
    c = [[Coordinate alloc] init];
}

-(void)addToStack:(Coordinate *)coord{
    c.x=coord.x;
    c.y = coord.y;
    if (coord.x==0 && coord.y==0) {
        c.x=coord.x+1;
        [_stack addObject:c];
        c.x=coord.x;
        c.y=coord.y+1;
        [_stack addObject:c];
        c.y=coord.y;
    }
}