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