Casting sicuro, ma Exc_bad_access comunque
-
28-10-2019 - |
Domanda
Disclaimer: sono abbastanza nuovo a OBJ-C e iOS (5, ARC abilitato).
La seguente implementazione di un metodo NsurlConnectionDelegate crea Exc_Bad_Access nella chiamata NSLog all'interno di 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]);
}
}
Per quanto sono riuscito a scoprirlo, Exc_Bad_Access è causato principalmente a causa di problemi di allocazione, casting errati e cattiva gestione della memoria. Niente di tutto ciò si applica qui (spero).
Grazie in anticipo, Chris
Soluzione: Errore Noobie nella formattazione della stringa OG. Cambia il secondo NSLog in:
NSLog(@"HTTP status code %i", [httpResponse statusCode]);
Soluzione
statusCode
Restituisce un NSInteger
(un long
o un int
), non un puntatore a un NSObject
esempio.
L'agente specificatore del formato %@
è usato per NSObject
argomenti. Il problema probabilmente si verifica quando il valore intero che viene restituito statusCode
viene interpretato/passato come puntatore a un oggetto e quindi messaggi o altrimenti trattati come puntatore a un oggetto dal runtime. Quando viene stampato un argomento oggetto tramite %@
Il logger utilizza il risultato dell'oggetto -[NSObject description]
.
Puoi evitare questo problema in futuro, rivelando i tuoi avvertimenti del compilatore e correggendo i problemi che genera.