【问题标题】:how do you swap two arrays in obj-c如何在 obj-c 中交换两个数组
【发布时间】:2011-08-02 20:17:53
【问题描述】:

这是在目标 C 中交换两个 ivar 数组的便捷方式吗?

- (void) foo {
    NSArray *aux;
    aux = array1;
    array2 = array1;
    array1 = array2;
}

还有其他选择吗?在某些情况下,它可能会出现与 retainCount 相关的问题吗? 我很困惑,因为在我正在审查交换的程序中是由以下人员完成的:

- (void) foo {
    NSArray *aux;
    aux = array1;
    [aux retain];
    array2 = array1;
    array1 = array2;
    [aux release];
}

【问题讨论】:

    标签: objective-c arrays swap


    【解决方案1】:

    它们都不起作用,你没有在任何地方使用你的 aux 变量,最后它们都会指向同一个内存位置,而是这样做:

    - (void) foo {
        NSArray *aux;
        aux = array1;
        array1 = array2;
        array2 = aux;
    }
    

    【讨论】:

    • 如果array1或array2被合成,这会有问题,不是吗?
    • 好吧,这取决于您是否要保留分配的值,然后您需要调用retain,如果它是合成的,它将取决于它是如何声明的,尽管除非您使用self.array1,否则您不是使用 setter 进行分配。
    【解决方案2】:

    在您的示例中,您只是交换了指针。顺便说一句,你在做 错了:

    - (void) foo {
        NSArray *aux;
        aux = array1;       /* aux is array1 */
        array2 = array1;    /* array2 is array1 */
        array1 = array2;    /* array1 is array1 */
    }
    

    如果您在这些数组上有属性,我建议您使用它:

    - (void)swapMyArrays
    {
        NSArray *temp = [NSArray arrayWithArray:self.array1];
        [self setArray2:array1];
        [self setArray1:temp];
    }
    

    【讨论】:

    • 您会推荐它用于任何类型的财产(保留、转让或复制)吗?
    • 保留和复制都可以。将它与 assign 属性一起使用只会交换 array2 的指针并破坏 array1,因为在我的示例中它被分配给了一个自动释放的对象。无论如何,在对象中使用 assign 属性并不常见。
    • 我认为您的代码中还有一个错字(在 SwapArrays 第一条语句中)。
    • 对不起 user870560,我现在不在我的计算机上,我无法找到它。可能是什么错误?
    • 我觉得应该是这样的: NSArray *temp = [NSArray arrayWithArray:self.array2];无论如何,谢谢你的回答,它帮助我澄清了事情。
    【解决方案3】:

    我认为你最后有一个错误,应该是:

    - (void) foo {
        NSArray *aux;
        aux = array1;
        array1 = array2;
        array2 = aux; // instead of array2 = array1
    }
    

    否则,您将两个数组设为同一个数组。

    我编辑了关于我所做的变量错误的(正确的)cmets 的答案。

    【讨论】:

    • 这是不正确的,在您的示例中,两者最终都会指向 array1 的内存位置。
    • 如果array1或array2被合成,这会有问题,不是吗?
    • @Oscar Gomez - 这是一个错字,感谢您指出这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    相关资源
    最近更新 更多