NSError * vs NSError **

时间:2012-02-22 05:23:58

标签: objective-c ios

我意识到这与现有帖子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对象?

4 个答案:

答案 0 :(得分:8)

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

使用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.

如果您希望指针发生更改,则需要发送指向该指针的指针并进行更改。这让人很困惑,但要为自己绘制一张记忆图并考虑一下。 :)

答案 1 :(得分:4)

这都是关于双指针的。

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

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

答案 2 :(得分:0)

这就是C语言的工作原理。您可能想看看这个问题并回答: C double pointer,这基本上是一个不同的伪装。

答案 3 :(得分:0)

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

就像

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

以后如果将任何新对象分配给error2,如

error2 = obj2;

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