質問

I'm not sure if this is correct or not:

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

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

the line:

*error = parserError;

I set error in parameter to be a local error, is it done correctly?

or should I do:

error = &parserError;

instead?

役に立ちましたか?

解決

You need to make sure error isn't nil before you try to dereference it. Also, there is no need for the local NSError. It'd write that code this way:

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

But if you really wanted the locale variable (or for demonstration purposes). then this:

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

Also, most methods that have an NSError out parameter like this usually have a BOOL return value or some other return value to indicate success or not. You shouldn't rely in the error parameter to indicate whether there was an error or not.

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

    return ok;
}

他のヒント

In this case you would probably want to pass the error further without intermediate variables. However, you need to be sure the myParser object handles the error parameter properly.

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

In case you want to handle it here, you need to make sure the pointer to pointer error points to something, otherwise you will have crash when dereferencing it.

For example: the method was called like this

[object parseSomething:targetObject error:NULL];

The following line leads to crash:

*error = parserError;

Correct code would look like this:

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

Not a problem when parserError is nil, but when error is nil.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top