Safe Casting, but EXC_BAD_ACCESS anyway
-
28-10-2019 - |
Question
Disclaimer: I'm quite new to Obj-C and iOS (5, ARC enabled).
The following implementation of an NSURLConnectionDelegate method creates EXC_BAD_ACCESS in the NSLog call inside the if:
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
NSLog(@"Response %@", response );
if([response isKindOfClass:[NSHTTPURLResponse class]])
{
NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*) response;
NSLog(@"HTTP status code %@", [httpResponse statusCode]);
}
}
As far as I managed to find out, the EXC_BAD_ACCESS is caused mostly due to allocation issues, wrong casting, and bad memory management. None of that applies here (I hope).
Thanks in advance, Chris
Solution: Noobie error in formatting the og string. Change the second NSLog to:
NSLog(@"HTTP status code %i", [httpResponse statusCode]);
Solution
statusCode
returns an NSInteger
(a long
or an int
), not a pointer to an NSObject
instance.
The format specifier %@
is used for NSObject
s arguments. The problem likely occurs when the integer value that is returned from statusCode
is interpreted/passed as a pointer to an object and then messaged or otherwise treated as a pointer to an object by the runtime. When an object argument is printed via %@
the logger uses the result of the object's -[NSObject description]
.
You can avoid this problem in the future by turning up your compiler warnings and correcting the issues it generates.