【问题标题】:Objective-C: Objects are passed by value?Objective-C:对象是按值传递的?
【发布时间】:2012-01-31 15:51:36
【问题描述】:

我知道以前有人从不同的角度问过这个问题。
但是,我还没有看到一个直接的答案,明确的对象是如何在 Objective-c 中传递的。经过一个月的目标 c 编码经验(来自 Java),我看到对象是按值传递的。 这是真的吗?

在我的代码中,我有一个 Person 类型的对象的 NSArray。我从 NSArray 中取出一个对象,对其进行编辑,然后看到 NSArray 中任何对象的值都不会受到影响,直到我调用 replaceObjectAtIndex: 方法。令我惊讶的是,这个场景向我展示了 Objective C 中的显式对象是按值传递的。

【问题讨论】:

  • 不正确。所有对象实例都是引用(,指向对象的指针)。
  • 如果你所有的引用都指向同一个内存位置,你描述的情况是不可能的。

标签: objective-c pointers reference


【解决方案1】:

Objective-C 中的对象总是通过引用传递。就它与 C 的接口而言,您实际上是按值指向对象的指针,但不值得细细琢磨。

虽然在 Objective-C 中有两种类型的对象字面量,字符串和块,并且后者允许存在于堆栈而不是堆上,但它仍然是通过引用来处理的。

您执行的测试一定存在某种缺陷。

【讨论】:

    【解决方案2】:

    在 C 中,一切都是按值传递的,只是其中一些值是指针。传递指针允许您只将“路标”传递给目标对象,而不是整个对象本身。您可以通过跟随指针来操作对象;任何持有指向同一对象的指针的人都会看到任何其他代码对其所做的更改。

    所有的 Objective C 对象都是通过指针来处理的,所以你应该已经看到了你的数组示例中的变化。例如,

    NSArray *myArray = ...;
    id element = [myArray objectAtIndex:n];
    element.foo = @"Bar";
    
    // [[myArray objectAtIndex:n] foo] is now "Bar";
    

    你的测试代码是什么?

    【讨论】:

      【解决方案3】:

      您的测试中出现了某种错误。

      NSMutableString *string = [@"foo" mutableCopy];
      NSArray *array = [NSArray arrayWithObject:string];
      [string appendString:@"bar"];
      NSLog(@"%@", array);
      
      
      > [...] (
      >     foobar
      > )
      

      在 Objective-C 中,所有对象总是由指针引用。

      【讨论】:

      • 所以你是说Objective C在这个意义上就像java?如果我想按值传递显式对象怎么办?
      • (我猜你在技术上“可以”,但它会涉及诡计,并表明你写东西的方式有问题。)
      • 谢谢。我刚刚在此处看到有关此主题的一些相互矛盾的信息,因此需要澄清。
      猜你喜欢
      • 2015-06-12
      • 2014-04-08
      • 2012-07-29
      • 2011-07-12
      • 1970-01-01
      • 1970-01-01
      • 2016-07-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多