【问题标题】:Are Objective-C Objects Pass By Value or Pass By Reference?Objective-C 对象是按值传递还是按引用传递?
【发布时间】: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 是按值传递的(就像所有参数一样)。

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


【解决方案1】:

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

【讨论】:

  • 意图?? :P。 iOS 范围内的意图是什么??
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 感谢您的澄清。
    猜你喜欢
    • 2014-04-08
    • 1970-01-01
    • 2016-11-28
    • 2017-11-14
    相关资源
    最近更新 更多