Objective-C:对象按值传递?

时间:2012-01-31 15:51:36

标签: objective-c pointers reference

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

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

3 个答案:

答案 0 :(得分:2)

Objective-C中的对象始终通过引用传递。就它如何与C接口而言,你实际上是指向逐个对象的指针,但它不值得拆分。

尽管Objective-C中有两种类型的对象文字,但是字符串和块,以及后者允许它们存在于堆栈而不是堆中,它仍然可以通过引用来处理。

你所进行的测试肯定有某种不足之处。

答案 1 :(得分:0)

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

所有Objective C对象都是通过指针处理的,因此您应该已经看到了数组示例中的更改。例如,

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

// [[myArray objectAtIndex:n] foo] is now "Bar";

您的测试代码是什么?

答案 2 :(得分:0)

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

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


> [...] (
>     foobar
> )

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