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

Posted

技术标签:

【中文标题】Objective-C 对象是按值传递还是按引用传递?【英文标题】:Are Objective-C Objects Pass By Value or Pass By Reference? 【发布时间】:2015-06-12 17:47:43 【问题描述】:

所以我有类似的东西:

- (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];
    

【问题讨论】:

您应该从您的 C 基础知识中知道,Objective-C objects 是通过 reference 传递的。如果你不懂 C,那么你不应该与 Objective-C 混在一起。 @HotLicks C 的基础知识并没有教任何关于 Objective-C 对象(或任何其他 Objective-C 特定特性)如何表现的内容。 C 教的唯一一件事(关于这个问题)是对象 pointers 是按值传递的(就像所有参数一样)。 【参考方案1】:

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

【讨论】:

意图?? :P。 ios 范围内的意图是什么??【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

Objective-C 中每种类型的一切都是仅按值传递

这个问题是无效的,因为“对象”不是 Objective-C 中的值,因此不能被“传递”——你不能有一个变量或表达式的值“是一个对象”(裸对象类型不允许在语言)——相反,“对象”必须始终在指向对象的指针后面进行操作。由于“对象”不是值,不能“传递”它们,所以问它们是“按值传递”还是“按引用传递”是没有意义的。

【讨论】:

感谢您的澄清。

以上是关于Objective-C 对象是按值传递还是按引用传递?的主要内容,如果未能解决你的问题,请参考以下文章

.bind(this) 是按引用传递还是按值传递?

JavaScript 是按引用传递还是按值传递语言?

JS基础类型和对象,分别是按值传递还是按引用传递?

JavaScript 是按引用传递还是按值传递? [复制]

js传参是按值传递还是按引用传递?

java中的参数传递是按引用传递还是按值传递