【问题标题】:Objective-C pass by reference vs pass by pointer. What's the difference? And why do we need it at all? [duplicate]Objective-C 通过引用传递与通过指针传递。有什么不同?为什么我们需要它? [复制]
【发布时间】:2013-10-11 16:55:26
【问题描述】:

在 Objective-C 中,我看到了将对象传递给函数的两种常见模式。基本上所有对象到函数都是通过引用传递的,如下所示: -(void) someFunc:(UIImage*)image;这是通过引用传递的,不是吗?

但是这是什么: -(void) someFunc2:(UIImage**)image??它也通过引用传递吗?还是通过指针传递指针?或者是什么?我不明白实际的区别是什么(但我经常看到这段代码)。主要问题是:为什么我们需要这个指向指针传递的指针:-(void) someFunc2:(UIImage**)image?谢谢。

【问题讨论】:

  • 所有对象参数都是通过引用传递的,因为它们是指针。
  • @Aaron 其实对象指针参数都是传值的。
  • 好的。那么在这种情况下,价值/参考之间有什么区别?无论哪种方式,对象指针都指向正在传递的对象,因此可以由接收它的函数更改。这不准确吗?
  • rmaddy 表示 POINTER 本身是按值传递的。真正的“通过引用传递”在objective-c中不存在
  • 在实践中,通过值传递指向对象的指针,和在 C# 中通过引用传递对象在功能上是等效的。

标签: ios objective-c parameter-passing


【解决方案1】:

传递双指针允许函数交换你传入的对象。一个很好的例子是所有将双指针传递给 NSError 的许多 Cocoa API。看看这个:

NSError *error = nil;
Result *result = [self someMethodWithPossibleError:&error];
if (![result isValid]) {
    //handle the error
    NSLog(@"Error occurred: %@", error);
}

在这种情况下,我们没有传递一个实际的错误实例,但是由于我们传递了一个指向我们的错误的指针,这允许他们在这个方法中创建一个 NSError 实例,退出后,我们将指向那个新实例。

【讨论】:

  • 虽然是个坏例子。您应该从不测试error 以查看该方法是通过还是失败。您必须始终测试方法的结果,然后仅当方法的返回值指示错误时才考虑error。 (显然,someMethodWithPossibleError: 可以使用不同的模式来实现,但这将明确反对整个系统使用的模式)。
  • @bbum 好点!编辑了我的答案。
猜你喜欢
  • 2014-07-25
  • 2020-11-16
  • 1970-01-01
  • 1970-01-01
  • 2010-09-24
  • 1970-01-01
  • 1970-01-01
  • 2011-04-07
相关资源
最近更新 更多