NSError * vs NSError **

我意识到,这是类似于现有的职位, 这是什么(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; } 

实施使用:

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

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

我发现把指针看作一个整数是有帮助的。 (就是这样)

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

如果你想要改变指针,你需要发送一个指针指向那个指针并改变它。 这是令人困惑的,但要画出自己的记忆图并思考。 🙂

这都是关于双指针的。

为什么不显示新的价值? 因为你永远不会修改你初始化为零的对象的内容。 要做到这一点,你将需要使用一个引用存储位置的零值存储(一个指针指针),而不是只有一个副本的零值(这是你正在通过使用单个指针)。

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

这是C语言的工作原理。 你可能想看看这个问题和答案: C双指针 ,这是在不同的外表基本上是相同的东西。

那么somemethodWithError具有的error就是不同的指针,它包含调用someMethodWithError的错误地址。 所以当你将任何对象指定给someMethodWithError error指针时,它将不会反映从它被调用的方法的错误指针

就像是

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

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

 error2 = obj2; 

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