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

gra*_*aci 10 objective-c pass-by-reference pass-by-value

因为我们总是使用指针来定义变量,所以我想知道Objective-C是否是"按值传递",因为像Java一样,实际值将通过使用它的引用来传递.

但是,由于它似乎是在C之上构建的,它是否具有C的所有功能?

Gab*_*lla 20

C不支持pass-by-reference和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
Run Code Online (Sandbox Code Playgroud)

另一方面,在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)
Run Code Online (Sandbox Code Playgroud)

  • 不,这不对.你仍然将指针的值传递给`var`.这就像做`void*p =&var; somefunction(P);` (7认同)
  • 这不是真的.当你执行`somefunction(&var);`var通过引用传递时. (2认同)
  • 我不得不去找我的Kernigham&Richie(C的发明家)一书.你是对的,我道歉!!!! (2认同)
  • @Merlevede没有问题,这是一个相当微妙的区别.我很高兴我们对此进行了整理. (2认同)
  • @ Cy4AH,同意,但从更高层次的观点来看,这会产生很大的不同.例如,引用是不可变的,即它们不支持指针算术.例如,Java仅支持引用而不是指针的事实使其成为托管语言. (2认同)
  • @GabrielePetronella:"就像Java一样,C++有真正的引用." Java没有pass-by-reference.在Java中,"引用"被定义为指向对象的指针,这也是大多数语言中"引用"的含义."C++参考"完全是另一回事. (2认同)