2010-06-09 6 views
2

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?

Répondre

3

Le setter appelle [retain] sur la nouvelle valeur et [release] sur l'ancienne valeur. L'un d'entre eux doit être invalide (et non nul) pour provoquer un mauvais accès. SendPost n'initialise pas sa variable d'erreur locale et si elle n'est pas définie par NSURLConnection, elle contient des données parasites. Essayez d'initialiser l'erreur à zéro dans sendPost.

+0

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

+0

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

1

Avez-vous déjà libéré serverResponse dans le message sendPost:?

Vous ne parvenez jamais à init init parent. Essayez quelque chose comme:

- (ServerResponse*) initWithResponse:(NSURLResponse*)resp error:(NSError*)err data:(NSData*)serverReply 
{ 
    if (self = [super init]) 
    { 
     // .... 
    } 
    return self; 
} 
+0

Je n'ai pas de méthode init, la méthode initWithResponse: est l'initialiseur. L'initialisation des variables locales semble le réparer (je m'attendais à ce que NSUrlConnection les initialise - bizarre qu'il ait fonctionné jusqu'à présent) Et oui, la ServerResponse est divulguée je pense - un problème distinct. – frankodwyer

Questions connexes