我意识到这与这里的现有帖子What's the Point of (NSError**)error?类似,但我的问题有点不同。我了解双指针是如何工作的,以及这是常见的iOS应用编程接口错误模式。我的问题更多的是关于单指针,以及为什么这段代码不能工作:
- (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对象?
发布于 2012-02-22 13:51:25
我发现将指针看作是一个整数会很有帮助。(它就是这样。)
用一个int来看一下你的例子。
-(BOOL)someMethodWithError:(int)error
{
error =100;
return NO;
}该整数通过值传递。调用该函数后,error将不会更改。
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.如果你想改变指针,你需要发送一个指向该指针的指针并改变它。这是令人困惑的,但你自己画一个内存图,并思考它。:)
发布于 2012-02-22 13:50:49
这都是关于双指针的。
为什么新的值没有显示出来?因为您从未修改过初始化为nil的对象的内容。为此,您需要使用对存储nil值的内存位置的引用(指向指针的指针),而不仅仅是nil值的副本(这是您使用单个指针传递的内容)。
这在C中是很常见的事情,在C中,函数的一些输出通过输入参数中的指针“返回”。
发布于 2012-02-22 13:39:06
这就是C语言的工作方式。您可能想看一下这个问题和答案:C double pointer,这基本上是不同的伪装的相同的东西。
https://stackoverflow.com/questions/9389502
复制相似问题