2

我不确定这是否正确:

- (void)parseSomething:(id)targetObject error:(NSError **)error {
    NSError *parserError = nil;
    [myParser parse:targetObject error:&parserError];

    if (parserError != nil) {
        *error = parserError;
    }
}

该行:

*error = parserError;

我将参数中的错误设置为本地错误,是否正确完成?

或者我应该这样做:

error = &parserError;

反而?

4

2 回答 2

5

error在尝试取消引用之前,您需要确保它不是 nil。此外,不需要本地 NSError。它会这样写代码:

- (void)parseSomething:(id)targetObject error:(NSError **)error {
    [myParser parse:targetObject error:error];
}

但是,如果您真的想要语言环境变量(或出于演示目的)。那么这个:

- (void)parseSomething:(id)targetObject error:(NSError **)error {
    NSError *parserError = nil;
    [myParser parse:targetObject error:&parserError];
    if (error && parserError) {
        *error = parserError;
    }
}

此外,大多数具有NSError像这样的 out 参数的方法通常都有一个 BOOL 返回值或其他一些返回值来指示成功与否。您不应依赖错误参数来指示是否存在错误。

- (BOOL)parseSomething:(id)targetObject error:(NSError **)error {
    NSError *parserError = nil;
    BOOL ok = [myParser parse:targetObject error:&parserError];
    if (error && parserError) {
        *error = parserError;
    }

    return ok;
}
于 2012-10-25T05:42:46.913 回答
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;
    }
}

什么时候是 nil 不是问题parserError,而是什么时候error是 nil。

于 2012-10-25T05:46:48.210 回答