【问题标题】:Is Objective-C pass-by-value or pass-by-reference?Objective-C 是按值传递还是按引用传递?
【发布时间】:2014-04-08 10:08:33
【问题描述】:

由于我们总是使用指针来定义变量,我想知道 Objective-C 是否是“按值传递”,因为与 Java 一样,实际值将通过使用其引用来传递。

但是,既然它似乎是建立在 C 之上的,那么它会具备 C 的所有功能吗?

【问题讨论】:

  • 和 C 一样,它是按值传递的。当然,您可以通过使用带有参数的& 来模拟传递引用,但这只是模拟。

标签: objective-c pass-by-reference pass-by-value


【解决方案1】:

它是 C 的严格超集。 它的作用与 C 相同。 这是所有对象实际上都是指向结构的指针的原因之一。

【讨论】:

    【解决方案2】:

    C 不支持 pass-by-reference,而作为 C 的严格超集的 Objective-C 也不支持。

    在 C(和 Objective-C)中,您可以通过传递指针来模拟 pass-by-reference,但重要的是要记住,从技术上讲,您仍然在传递一个值,而这恰好是a 指针的值。

    因此,在 Objective-C(以及 C,就此而言)中,没有其他语言(例如 C++ 或 Java)所预期的引用概念。

    这可能会令人困惑,所以让我试着更清楚一点(我将使用纯 C,但是 - 再说一遍 - 它在 Objective-C 中没有改变)

    void increment(int *x) {
       *x++;
    }
    
    int i = 42;
    increment(&i); // <--- this is NOT pass-by-reference.
                   //      we're passing the value of a pointer to i
    

    另一方面,在 C++ 中我们可以这样做

    void increment(int &x) {
       x++;
    }
    
    int i = 41;
    increment(i); // <--- this IS pass-by-reference
                  //      doesn't compile in C (nor in Objective-C)
    

    【讨论】:

    • 这不是真的。当您执行 somefunction(&amp;var); 时,var 正在通过引用传递。
    • 不,不是。您仍在将指针的值传递给var。这就像在做void *p = &amp;var; somefunction(p);
    • 我不得不去拿我的 Kernigham & Richie(C 的发明者)书。你是对的,我道歉!!!!
    • @Merlevede 没问题,这是相当微妙的差异。我很高兴我们解决了这个问题。
    • @Cy4AH,同意,但从更高层次的角度来看,这会产生很大的不同。例如,引用是不可变的,即它们不支持指针运算。例如,Java 仅支持引用而不支持指针这一事实使其成为托管语言。
    猜你喜欢
    • 2015-06-12
    • 1970-01-01
    • 2016-11-28
    • 2017-11-14
    相关资源
    最近更新 更多