Casting sûr, mais exc_bad_access de toute façon
-
28-10-2019 - |
Question
Avertissement: je suis assez nouveau sur OBJ-C et iOS (5, ARC activé).
L'implémentation suivante d'une méthode nsurlConnectionDelegate crée exc_bad_access dans l'appel nslog à l'intérieur du 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]);
}
}
Pour autant que j'ai réussi à le découvrir, l'EXC_BAD_ACCESS est principalement dû à des problèmes d'allocation, à une mauvaise casting et à une mauvaise gestion de la mémoire. Rien de tout cela ne s'applique ici (j'espère).
Merci d'avance, Chris
La solution: Erreur noobie dans le formatage de la chaîne OG. Changez le deuxième NSLOG en:
NSLog(@"HTTP status code %i", [httpResponse statusCode]);
La solution
statusCode
retourne un NSInteger
(un long
ou un int
), pas un pointeur vers un NSObject
exemple.
Le spécificateur de format %@
est utilisé pour NSObject
S des arguments. Le problème se produit probablement lorsque la valeur entière qui est renvoyée statusCode
est interprété / passé comme un pointeur vers un objet, puis envoyé un message ou autrement traité comme un pointeur vers un objet par l'exécution. Lorsqu'un argument d'objet est imprimé via %@
L'enregistreur utilise le résultat de l'objet -[NSObject description]
.
Vous pouvez éviter ce problème à l'avenir en augmentant vos avertissements de compilateur et en corrigeant les problèmes qu'il génère.