2009-11-20 10 views
0

J'ai une erreur bizarre à laquelle je n'arrive pas à trouver de documentation ou de publications. Lorsque j'essaie de me connecter à mon service Web (URL modifiée pour la confidentialité) à l'aide de la méthode de manuel standard, je reçois EXC_BAD_INSTRUCTION ou EXC_BAD_ACCESS sur [NSURLConnection initWithRequest]. La chose la plus étrange est que, à l'occasion, je peux franchir la ligne fautive sans aucune exception, mais 9 fois sur 10, il provoque cette erreur. Aucune suggestion?EXC_BAD_INSTRUCTION avec URLConnection initWithRequest

- (void)viewDidLoad { 
    NSURL *url = [NSURL URLWithString:@"http://heres/where/my/webservice/url/is/"]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:30.0]; 

    // cancel any old connection 
    if(connection) { 
     [connection cancel]; 
     [connection release]; 
    } 

    // create new connection and begin loading data 
    connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
    if(connection) { 
     // if the connection was created correctly, release old data (if any), and alloc new 
     [data release]; 
     data = [[NSMutableData data] retain]; 
    } 

    [url release]; 
    [request release]; 
} 

Toute aide ou suggestion ou RTFM seront les bienvenues!

Répondre

1

Vous libérons objets autoreleased:

NSURL *url = [NSURL URLWithString:@"…"]; 
NSURLRequest *request = [NSURLRequest requestWithURL:url …]; 
// … 
[url release]; 
[request release]; 

Je pense que Clang devrait pouvoir attraper ces derniers, voir → Générer et analyser (Cmd-Shift-A). Clang est votre ami, s'habituer.

+0

Merci zoul, j'utilise Clang maintenant. J'ai supprimé les versions incriminées selon votre suggestion, mais j'ai obtenu la même erreur. –

+0

En outre, pas sûr si cela aide ou non, mais la ligne incriminée semble effectivement être: NSURLRequest * theRequest = [NSURLRequest requestWithURL: url \t \t \t \t cachePolicy: NSURLRequestUseProtocolCachePolicy timeoutInterval: 60,0]; Et dans la trace, la dernière chose que je peux voir est NSURLProtocolInit. –

+0

La réponse de Zoul est tout à fait correcte, en ce sens que vous envoyez un message 'release' aux objets, quand vous ne les avez pas" initiés ". Donc, vous devriez supprimer ces deux lignes, au moins. De même, vous ne devez pas libérer 'data' à moins d'être' init'ialized dans cette méthode ou dans une autre. Si vous le relâchez avant de l'initialiser, vous obtiendrez une erreur. –

0

EXC_BAD_ACCESS signifie que vous essayez de libérer un objet qui a déjà été libéré. Comme dit zoul, les méthodes d'url et de requête que vous utilisez sont des méthodes de libération automatique, donc vous ne devriez pas les publier manuellement à la fin de votre code.

Ce que vous devriez faire est d'accepter sa réponse ... parce qu'il a raison.

+0

J'apprécie votre aide mais le problème que j'avais était avec EXC_BAD_INSTRUCTION. J'ai depuis enlevé les versions et toujours recevoir cette erreur, mais j'accepte sa réponse puisque pour l'EXC_BAD_ACCESS il est certainement correct. Zoul, merci pour votre aide. –