【发布时间】:2016-12-26 12:38:48
【问题描述】:
尽管我已经阅读了 Why does NSError need double indirection? (pointer to a pointer) 和 NSError * vs NSError ** 等等,但我现在对指针的指针感到困惑。
我已经做了一些思考,但仍有一些问题。
这是我写的:
NSError *error = [NSError errorWithDomain:@"before" code:0 userInfo:nil];
NSLog(@"outside error address: %p", &error];
[self doSomethingWithObj:nil error:&error];
为了测试上面的NSError方法,我写了这个:
- (id)doSomethingWithObj:(NSObject *)obj error:(NSError *__autoreleasing *)error
{
NSLog(@"inside error address: %p", error);
id object = obj;
if (object != nil)
{
return object;
}
else
{
NSError *tmp = [NSError errorWithDomain:@"after" code:0 userInfo:nil];
*error = tmp;
return nil;
}
}
但是我发现这两个日志地址是不同的。这是为什么呢?
2016-08-19 19:00:16.582 Test[4548:339654] outside error address: 0x7fff5b3e6a58
2016-08-19 19:00:16.583 Test[4548:339654] inside error address: 0x7fff5b3e6a50
他们不应该是一样的,因为那只是一个简单的价值副本吗?如果它们应该不同,指向指针的指针如何最终指向同一个NSError 实例?
【问题讨论】:
-
编译器必须对指向指针的指针做一些事情,也许是为了处理 ARC。在最新版本的 Objective-C 中,指针得到了太多的聪明,所以以前简单的值复制可能不再那么简单了。您可能希望以与
NSError无关的方式重新表述这个问题 - 例如,“指针在作为方法参数传递时发生变化”或类似的内容。 -
但是 NSError* __autoreleasing* 是一种在任何地方都可以使用的模式,编译器会以不同的方式识别和处理它。
标签: ios objective-c pointers nserror