When does NSURLConnection's initWithRequest return nil
Does anyone know in which situations initializing a NSURLConnection
returns nil instead of the created connection. The documentation says it's possible but fails to specify when this happens.
The method/message in question:
[[NSURLConnection alloc] initWithRequest:request delegate:self];
-
According to the NSURLConnection
Class Reference:
Return Value: The URL connection for the URL request. Returns nil if a connection can't be initialized.
The URL Loading System Programming Guide says the following:
If NSURLConnection can’t create a connection for the request, initWithRequest:delegate: returns nil.
-
While it's possible that this method returns nil, I'm unable to come up with a scenario which triggers this. I've tried the following scenarios:
URLRequest
with an empty url:connection:didFailWithError:
delegate method is called with "unsupported URL" as error.URLRequest
with invalid url:connection:didFailWithError:
delegate method is called with "bad URL" as error.URLRequest
with nonexistent url:connection:didFailWithError:
delegate method is called with "A server with the specified hostname could not be found." as error.- Valid request but no internet:
connection:didFailWithError:
delegate method is called with "The I开发者_如何学编程nternet connection appears to be offline." as error. - nil request: causes a crash.
The initWithRequest
method returned a valid NSURLConnection
in each scenario (besides the last one) and called the connection:didFailWithError:
with an appropriate error.
Has anybody been able to figure out which scenario does cause nil to be returned?
I believe this can also be used when it fails to load, not just initialize. (The alloc is done separately - that's where low mem would probably bite you) So (I'm guessing) it could fail because you did not have a network available (3G/Wifi) or it simply failed to connect to the server. In any event, use:
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
To get the actual failure.
You may be able to simulate this with an absence of a network - or even giving it a bad URL.
I guess the answer is "Never". Seems only way for NSURLConnection to return nil is failing at [super init]. ([super init] returning nil) But as super class of NSURLConnection is NSObject and NSObjects init just returns self (never nil)
PS: That's for IOS SDK 4.0, on emulator, can be different on device.
I would try all of the above except do it during low memory conditions. IE, I think it will happen when an internal malloc fails.
I thing this is caused if the request u specified has wrong or not all essential values
NSURLConnection returns nil if it is not created inside a runLoop.
精彩评论