我不确定这是否正确:
- (void)parseSomething:(id)targetObject error:(NSError **)error {
NSError *parserError = nil;
[myParser parse:targetObject error:&parserError];
if (parserError != nil) {
*error = parserError;
}
}
行:
*error = parserError;
我将参数中的错误设置为本地错误,是否正确完成?
或者我应该这样做:
error = &parserError;
代替?
答案 0 :(得分:5)
在尝试取消引用之前,您需要确保error
不是nil。此外,不需要本地NSError。它以这种方式编写代码:
- (void)parseSomething:(id)targetObject error:(NSError **)error {
[myParser parse:targetObject error:error];
}
但是如果你真的想要locale变量(或者用于演示目的)。那么这个:
- (void)parseSomething:(id)targetObject error:(NSError **)error {
NSError *parserError = nil;
[myParser parse:targetObject error:&parserError];
if (error && parserError) {
*error = parserError;
}
}
此外,大多数具有NSError
输出参数的方法通常具有BOOL返回值或一些其他返回值以指示是否成功。您不应该依赖error参数来指示是否存在错误。
- (BOOL)parseSomething:(id)targetObject error:(NSError **)error {
NSError *parserError = nil;
BOOL ok = [myParser parse:targetObject error:&parserError];
if (error && parserError) {
*error = parserError;
}
return ok;
}
答案 1 :(得分:0)
在这种情况下,您可能希望在没有中间变量的情况下进一步传递错误。但是,您需要确保myParser
对象正确处理错误参数。
- (void)parseSomething:(id)targetObject error:(NSError **)error
{
[myParser parse:targetObject error:error];
}
如果你想在这里处理它,你需要确保指向指针error
的指针指向某个东西,否则你在取消引用它时会崩溃。
例如:该方法就像这样调用
[object parseSomething:targetObject error:NULL];
以下行会导致崩溃:
*error = parserError;
正确的代码如下所示:
- (void)parseSomething:(id)targetObject error:(NSError**)error
{
NSError* parserError = nil;
[myParser parse:targetObject error:&parserError];
if (error != nil)
{
*error = parserError;
}
}
当parserError
为零时,但error
为零时,不是问题。