Why does [[NSError alloc] init]; in Xcode throw an error?

Ludo picture Ludo · Nov 15, 2015 · Viewed 7.8k times · Source

I have the following code in Xcode :

NSError *error = [[NSError alloc] init];
NSData *urlData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

And it throws following error in the logs

[NSError init] called; this results in an invalid NSError instance. It will raise an exception in a future release. Please call errorWithDomain:code:userInfo: or initWithDomain:code:userInfo:. This message shown only once.

Maybe, you will tell me that the answer is in the log, but I do not understand how to init NSError.

Answer

trojanfoe picture trojanfoe · Nov 15, 2015

You are not allowed to create an NSError instance via -init; use -initWithDomain:code:userInfo: instead or the constructor method +errorWithDomain:code:userInfo:.

In your case it's redundant anyway as that method will create it in the case of error.

This is the normal pattern for using it:

NSError *error = nil;
NSData *urlData=[NSURLConnection sendSynchronousRequest:request
                                      returningResponse:&response
                                                  error:&error];
if (!urlData) {
    NSLog(@"Error: %@", [error localizedDescription]);
    return NO;
}

// Successful