Je reçois une erreur EXC_BAD_ACCESS étrange lors de l'exécution de mon application sur iOS4. L'application a été assez solide sur OS3.x depuis un certain temps - pas même voir les journaux de plantage dans cette zone du code (ou beaucoup du tout) dans la nature.Ce qui pourrait causer cette différence de comportement de l'iPhone OS3.0 à iOS4.0?
J'ai suivi l'erreur jusqu'à ce code:
classe principale:
- (void) sendPost:(PostRequest*)request {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSURLResponse* response;
NSError* error;
NSData *serverReply = [NSURLConnection sendSynchronousRequest:request.request returningResponse:&response error:&error];
ServerResponse* serverResponse=[[ServerResponse alloc] initWithResponse:response error:error data:serverReply];
[request.objectToNotifyWhenDone performSelectorOnMainThread:request.targetToNotifyWhenDone withObject:serverResponse waitUntilDone:YES];
[pool drain];
}
(Note: sendPost est exécuté sur un thread séparé pour chaque invocation de celui-ci PostRequest est juste une classe. pour encapsuler une requête et un sélecteur pour notifier lorsque complet)
ServerResponse.m:
@synthesize response;
@synthesize replyString;
@synthesize error;
@synthesize plist;
- (ServerResponse*) initWithResponse:(NSURLResponse*)resp error:(NSError*)err data:(NSData*)serverReply {
self.response=resp;
self.error=err;
self.plist=nil;
self.replyString=nil;
if (serverReply) {
self.replyString = [[[NSString alloc] initWithBytes:[serverReply bytes] length:[serverReply length] encoding: NSASCIIStringEncoding] autorelease];
NSPropertyListFormat format;
NSString *errorStr;
plist = [NSPropertyListSerialization propertyListFromData:serverReply mutabilityOption:NSPropertyListImmutable format:&format errorDescription:&errorStr];
}
return self;
}
ServerResponse.h:
@property (nonatomic, retain) NSURLResponse* response;
@property (nonatomic, retain) NSString* replyString;
@property (nonatomic, retain) NSError* error;
@property (nonatomic, retain) NSDictionary* plist;
- (ServerResponse*) initWithResponse:(NSURLResponse*)response error:(NSError*)error data:(NSData*)serverReply;
Cette plante de manière fiable avec un mauvais accès à la ligne:
self.error=err;
... i.e.. dans le setter de la propriété synthétisée! Je suis perplexe quant à pourquoi cela devrait être, étant donné le code travaillé sur le système d'exploitation précédent et n'a pas changé depuis (même le binaire compilé avec le SDK précédent se bloque de la même manière, mais pas sur OS3.0) - Et étant donné que c'est une méthode de propriété simple.
Des idées? L'implémentation de NSError aurait-elle changé entre les versions ou est-ce que quelque chose me manque?
hmm mais l'erreur est nulle au préalable quand je la passe dans le débogueur. même résultat que ce soit dans le simulateur ou sur l'appareil. – frankodwyer
qui a fait l'affaire (j'ai également initialisé la variable locale de réponse). Je m'attendais à ce que NSURLConnection les écrase - Je suppose que j'ai eu de la chance auparavant, et qu'ils étaient nuls, ou l'implémentation a changé en 4.0 et NSURLConnection libère l'ancienne valeur avant de définir les paramètres out. – frankodwyer