Objective-C是传值还是传引用?

10

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

然而,由于它似乎是建立在C语言之上的,它是否具有C语言的所有功能呢?


2
就像 C 语言一样,它是按值传递的。当然,你可以通过在参数前使用 & 来模拟按引用传递,但这只是模拟而已。 - Hot Licks
2个回答

24

C语言不支持按引用传递参数,而Objective-C作为C的严格超集也不支持。

在C(和Objective-C)中,您可以通过传递指针来模拟按引用传递参数,但重要的是要记住,您仍然在技术上传递一个值,该值恰好是指针的值。

因此,在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)

2
这是不正确的。当你执行 somefunction(&var); 时,变量 var 是通过引用传递的。 - Merlevede
8
不是的,你仍然传递了指向var值的指针。这就像执行void *p = &var; somefunction(p);一样。 - Gabriele Petronella
2
我去拿我的 Kernigham & Richie(C 语言的发明者)的书了。你是对的,我道歉!!! - Merlevede
2
@Cy4AH,同意,但从一个更高的层次来看,这会有很大的区别。例如,引用是不可变的,即它们不支持指针算术。Java仅支持引用而不支持指针的事实就是它成为受管理语言的原因之一。 - Gabriele Petronella
2
@GabrielePetronella:“C++有真正的引用,就像Java一样。” Java没有按引用传递。在Java中,“引用”被定义为指向对象的指针,这也是大多数语言中“引用”的含义。而“C++引用”则完全不同。 - newacct
显示剩余10条评论

1
它是C语言的严格超集。 它做的事情和C语言一样。 这就是为什么所有对象实际上都是指向结构体的指针的原因。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接