【问题标题】:NSError * vs NSError **NSError * 与 NSError **
【发布时间】:2012-02-22 05:23:57
【问题描述】:

我意识到这与此处的现有帖子What's the Point of (NSError**)error? 相似,但我的问题有点不同。我了解双指针是如何工作的,以及这是常见的 iOS API 错误模式。我的问题更多是关于单指针,以及为什么这段代码不起作用:

- (BOOL)someMethodWithError:(NSError *)error
{
  ...
  if( errorOccured )
  {
    NSError *e = [[[NSError alloc] initWithDomain:@"" code:1 userInfo:nil] autorelease];
    error = e;
    return NO;
  }

  return YES;
}

使用:

NSError *error = nil;
if( ![someObj someMethodWithError:error] )
{
  NSLog(@"Error: %@", [error localizedDescription]);
}

为什么方法实现中的赋值不将指针重新赋值给新的NSError对象?

【问题讨论】:

    标签: objective-c ios


    【解决方案1】:

    我发现将指针视为整数会有所帮助。 (就是这样。)

    用 int 看看你的例子。

    -(BOOL)someMethodWithError:(int)error
    {
         error =100;
         return NO;
    }
    

    该整数是按值传递的。调用该函数后,错误不会改变。

       error  = 123;
      [self someMethodWithError:error];
      //error is = 123;
    

    指针也是一样的。它是按值传递的。

      NSError * error; //this assigns this to a value in memory.
      NSLog(@"%p",error);
      [self someMethodWithError:error];
      NSLog(@"%p",error); // the value of error will not have changed.
    

    如果您想要更改指针,您需要发送指向该指针的指针并更改它。这很令人困惑,但给自己画一张记忆图并考虑一下。 :)

    【讨论】:

    • 优秀的解释 madmik。谢谢你。现在意识到指针是按值传递的,这完全有道理。
    • @madmik3:将指针视为“只是一个整数”可能很危险。指针是包含地址的变量。仅仅因为 C 允许您在指针上使用像 ++ 这样的算术运算并不意味着指针的行为就像整数一样。例如,如果您 ++int 类型的变量,您将在其值上加 1。但是,如果您 ++int * 类型的变量您将在其值上加 4
    • 我并不是建议您将它们视为同一件事,但是如果您查看它们如何响应传递的变量,就会清楚为什么有时您需要双指针。这只是为了示例。 :)
    【解决方案2】:

    都是关于双指针的。

    为什么没有显示新值?因为您从未修改过初始化为 nil 的对象的内容。为此,您需要使用对存储 nil 值的内存位置的引用(指向指针的指针),而不仅仅是 nil 值的副本(这是您使用单个指针传递的内容)。

    这是在 C 中非常常见的事情,其中​​函数的一些输出通过输入参数中的指针“返回”。

    【讨论】:

      【解决方案3】:

      这就是 C 语言的工作原理。你可能想看看这个问题和答案: C double pointer,这基本上是同一件事,但形式不同。

      【讨论】:

        【解决方案4】:

        error somemethodWithError 有一个不同的指针,它包含调用 someMethodWithError 的错误地址。因此,当您将任何对象分配给someMethodWithErrorerror 指针时,它不会反映在调用它的方法的错误指针中

        好像

        NSError * error1 = obj1;
        NSError * error2 = error1;
        

        如果你将任何新对象分配给 error2 之后

        error2 = obj2;
        

        它不会改变error1的指针值,它仍然会指向obj1

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-15
          • 1970-01-01
          • 1970-01-01
          • 2015-03-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多