Question

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?

Was it helpful?

Solution

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;
}

OTHER TIPS

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.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top