NSError*vs NSError**

Eri*_*ric 8 objective-c ios

我意识到这与现有帖子类似,(NSError**)错误是什么意思?,但我的问题有点不同.我理解双指针是如何工作的,以及这是常见的iOS API错误模式.我的问题更多的是关于单指针,以及为什么这段代码不起作用:

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

  return YES;
}
Run Code Online (Sandbox Code Playgroud)

实施使用:

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

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

mad*_*ik3 8

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

用int来看你的例子.

-(BOOL)someMethodWithError:(int)error
{
     error =100;
     return NO;
}
Run Code Online (Sandbox Code Playgroud)

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

   error  = 123;
  [self someMethodWithError:error];
  //error is = 123;
Run Code Online (Sandbox Code Playgroud)

指针是一回事.它是通过价值.

  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.
Run Code Online (Sandbox Code Playgroud)

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