【问题标题】:NSMutableArray of NSMutableArraysNSMutableArray 的 NSMutableArray
【发布时间】:2018-02-14 00:22:13
【问题描述】:

我想创建一个 NSMutableArrays 的 NSMutableArray。以下是伪代码:

NSMutableArray *mapcoords = [[NSMutableArray alloc] init]; 
NSMutableArray *clustercoords = [[NSMutableArray alloc] init];

while (!FINISHED)
{
   for(int j = 1;j <= 4;j++)
    {
       x = arc4random_uniform(45);
       [mapcoords addobject:[NSNumber numberWitInt:x]];

    }

    [clustercoords addobject:mapcoords];
    [mapcoords removeAllObjects];
}

当我在循环结束时检查“clustercoords”数组时,所有对象都包含相同的值。我想这一定是因为我每次将它添加到 clustercoords 时都指向同一个对象(mapcoords)。

我假设我需要几个不同的“mapcoords”数组,以便 mapccords 中的对象是唯一的。这是正确的假设吗?还有其他选择吗?

【问题讨论】:

    标签: objective-c arrays pointers cocoa-touch nsmutablearray


    【解决方案1】:

    你的假设是正确的。将mapcoords 的声明和创建移到while 循环内。

    NSMutableArray *clustercoords = [[NSMutableArray alloc] init];
    
    while (!FINISHED) {
        NSMutableArray *mapcoords = [[NSMutableArray alloc] init]; 
        for(int j = 1; j <= 4; j++) {
           u_int32_t x = arc4random_uniform(45);
           [mapcoords addObject:@(x)];
        }
    
        [clustercoords addObject:mapcoords];
    }
    

    【讨论】:

    • 效果很好。谢谢,麦迪!但是你能向我解释为什么这个解决方案有效吗?是不是我每次都在不同的内存位置创建一个名为“mapcoords”的新的唯一实例?
    • 没有。在您的代码中,您不断重复使用 mapcoords 变量引用的相同可变数组。您添加了 4 个数字,将对 mapcoords 的引用添加到 clustercoords 数组中。然后您删除了 4 个数字并添加了 4 个新数字。然后,您将另一个对 mapcoords 的引用添加到 clustercoords 数组中。一遍又一遍地重复。最后,您有 X 个对 clustercoords 中的一个 mapcoords 数组的引用,而一个 mapcoords 要么为空,要么包含最后一组 4 个数字,具体取决于您何时退出 while 循环。跨度>
    猜你喜欢
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多