Objective-C对象是通过值传递还是通过引用传递?

时间:2015-04-07 23:38:31

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

所以我有类似的东西:

- (void) printString:(NSString *)string 
{
    NSLog(@"%@", string);
}


NSString *string = @"Blach";
[self printString:string];

string会通过值或引用传入吗?怎么样的NSError?

NSError *error = [NSError errorWithDomain:someDomain 
                                     code:-101 
                                 userInfo:someInfo];

-(NSString *) doSomething:(BOOL) val withError:(NSError **)error {
    if(!val)
    {
       *errorPtr = [NSError errorWithDomain:something
                                       code:-101 
                                   userInfo:someInfo];
    }
}

3 个答案:

答案 0 :(得分:5)

你可以永远通过指针以外的任何东西来引用Objective-C对象,因此对于所有意图和目的,一切都是通过引用传递的。也就是说,实际的指针值是按值传递的,就像在C中一样。

答案 1 :(得分:1)

Objective-C中所有类型的内容都是仅按值传递

问题是无效的,因为“对象”不是Objective-C中的值,因此无法“传递” - 您不能拥有其值“是对象”的变量或表达式(不允许使用裸对象类型)语言) - 相反,必须始终在指向对象的指针后面操纵“对象”。由于“对象”不是值,你不能“传递”它们,因此询问它们是“按值传递”还是“按引用传递”是没有意义的。

答案 2 :(得分:0)

通过引用传递对象。在我看来,重要的区别在于被调用方法是否具有与调用者相同的对象的引用,或者它是否具有副本。它引用了同一个对象。

如果对象是可变的并且被调用的方法使其变异,它也会影响调用者所拥有的对象(因为它是同一个对象)。

对于NSError**参数,它实际上是通过引用传递的指针(不是对象)。具有这种参数的方法实际上可以修改调用者的指针,使其指向不同的对象。