首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSError * vs NSError **

NSError * vs NSError **
EN

Stack Overflow用户
提问于 2012-02-22 13:23:58
回答 4查看 3.3K关注 0票数 9

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

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

  return YES;
}

使用以下方式实施:

代码语言:javascript
复制
NSError *error = nil;
if( ![someObj someMethodWithError:error] )
{
  NSLog(@"Error: %@", [error localizedDescription]);
}

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-02-22 13:51:25

我发现将指针看作是一个整数会很有帮助。(它就是这样。)

用一个int来看一下你的例子。

代码语言:javascript
复制
-(BOOL)someMethodWithError:(int)error
{
     error =100;
     return NO;
}

该整数通过值传递。调用该函数后,error将不会更改。

代码语言:javascript
复制
   error  = 123;
  [self someMethodWithError:error];
  //error is = 123;

指针也是一样的东西。它是通过值传递的。

代码语言:javascript
复制
  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.

如果你想改变指针,你需要发送一个指向该指针的指针并改变它。这是令人困惑的,但你自己画一个内存图,并思考它。:)

票数 9
EN

Stack Overflow用户

发布于 2012-02-22 13:50:49

这都是关于双指针的。

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

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

票数 4
EN

Stack Overflow用户

发布于 2012-02-22 13:39:06

这就是C语言的工作方式。您可能想看一下这个问题和答案:C double pointer,这基本上是不同的伪装的相同的东西。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9389502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档