对Objective-C中使用一个或多个星号感到困惑
我正在读一本关于核心数据的书,在某种程度上,作者有这样一种验证方法:对Objective-C中使用一个或多个星号感到困惑,objective-c,variables,asterisk,Objective C,Variables,Asterisk,我正在读一本关于核心数据的书,在某种程度上,作者有这样一种验证方法: - (BOOL)validateRadius:(id *)ioValue error:(NSError **)outError { NSLog(@"Validating radius using custom method"); if ([*ioValue floatValue] < 7.0 || [*ioValue floatValue] > 10.0) { // Fill o
- (BOOL)validateRadius:(id *)ioValue error:(NSError **)outError {
NSLog(@"Validating radius using custom method");
if ([*ioValue floatValue] < 7.0 || [*ioValue floatValue] > 10.0) {
// Fill out the error object
if (outError != NULL) {
NSString *msg = @"Radius must be between 7.0 and 10.0";
NSDictionary *dict = [NSDictionary dictionaryWithObject:msg forKey:NSLocalizedDescriptionKey];
NSError *error = [[[NSError alloc] initWithDomain:@"Shapes" code:10 userInfo: dict] autorelease];
*outError = error;
}
return NO;
}
return YES;
}
第二种是在方法调用的接收器上使用单个星号*
:
[*ioValue floatValue]
这两样东西我以前都没见过,所以我想知道它们是关于什么的。大约6个月前刚开始iOS编程
欢迎对联机文档进行任何解释或指向联机文档的指针。(id*)ioValue
表示ioValue
是指向id的指针,而不是id本身。表达式*ioValue
指的是ioValue
指向的id
(NSError**)outError
表示outError
是指向NSError*
的指针(反过来,它又是指向NSError
的指针)
以这种方式向函数传递指针的通常原因是允许函数向调用方返回某些内容
在上述情况下,函数可以为调用者传入的变量分配一个新的id
:*ioValue=something()
。然而,由于上述函数实际上并没有做到这一点,它似乎是多余的;它可以写成(id)ioValue
,然后将其称为ioValue
,而不是*ioValue
然而,outError
的情况非常合理。如果发生错误,函数将创建一个错误对象(NSError*error=…
),并将其分配给传入的变量,因此:*outError=error
。这样做的效果是更改调用者传入的原始变量,以便在函数返回时,调用者可以检查变量以查看产生的错误:
id ioValue = something();
IOError *err;
if ([foo validateRadius:&ioValue error:&err]) {
NSLog("Yippee!");
} else {
reportError(err);
}
考虑<代码> *恐怖=错误;<代码>显示了为什么“将指针传递给指针”(
**
)是有用的。+1但我认为这应该解释*outError=error
以及它的工作原理(没有它,NSError**
就很傻了。)@pst:同意。我怀疑你在我修改我的答案时添加了你的评论。
id ioValue = something();
IOError *err;
if ([foo validateRadius:&ioValue error:&err]) {
NSLog("Yippee!");
} else {
reportError(err);
}