2010-11-16 28 views
0

Je suis en train de remplacer les occurences d'une chaîne en quelques étapes différentes, je me sers:iPhone SDK: erreurs lors du remplacement de la chaîne occurrences

NSString *doc = [[NSString alloc] initWithData:htmlData encoding:NSASCIIStringEncoding]; 
doc = [doc stringByReplacingOccurrencesOfString:@"###DATA###" withString:cord]; 
doc = [doc stringByReplacingOccurrencesOfString:@"###NAME###" withString:ride.title]; 
doc = [doc stringByReplacingOccurrencesOfString:@"###DESC###" withString:ride.description]; 

[doc release]; 

Je suis d'abord obtenir le texte d'un fichier et de vouloir remplacer un quelques cordes avec moi-même. Mais, je reçois l'erreur suivante lors de l'exécution suivante:

Program received signal: “EXC_BAD_ACCESS”. 
[Switching to thread 13059] 
Data Formatters temporarily unavailable, will re-try after a 'continue'. (Not safe to call dlopen at this time.) 

je ne comprends pas pourquoi je reçois une erreur de EXC_BAD_ACCESS. Qu'est-ce que j'essaie de sortir qui a déjà été publié ?!

+0

avez-vous vérifié la valeur de retour de doc? –

+0

avez-vous essayé de fournir un exemple de chaîne comme @ "hello ### DATA ### bye" et faire la même substitution? –

Répondre

2
NSString *doc = [[NSString alloc] initWithData:htmlData encoding:NSASCIIStringEncoding]; 
doc = [doc stringByReplacingOccurrencesOfString:@"###DATA###" withString:cord]; 

Lorsque vous attribuez à doc dans la deuxième ligne, vous perdez votre référence à la chaîne que vous avez initialement créé.

[doc release]; 

Dans la dernière ligne, lorsque vous relâchez la chaîne, vous ne libérez pas l'original. Vous libérez ce que c'est maintenant, qui est le résultat de la ligne avant cela. Donc, la chaîne d'origine fuit, vous libérez le remplacement, et cette libération excessive provoque un plantage. Soit autorelease votre chaîne d'origine lorsque vous le créez (et laissez tomber l'appel release final) ou utilisez un autre temporaire pour les chaînes modifiées que vous faites au milieu.

Par exemple, changer le code:

NSString *doc = [[[NSString alloc] initWithData:htmlData encoding:NSASCIIStringEncoding] autorelease]; 
doc = [doc stringByReplacingOccurrencesOfString:@"###DATA###" withString:cord]; 
doc = [doc stringByReplacingOccurrencesOfString:@"###NAME###" withString:ride.title]; 
doc = [doc stringByReplacingOccurrencesOfString:@"###DESC###" withString:ride.description]; 

Et il ne fuira pas. S'il se bloque toujours après cela, le crash proviendra d'une cause différente (comme si vous utilisiez la chaîne plus tard sans vous y attacher quelque part). GDB est votre ami - vérifiez ce qu'il dit dans sa trace.

+0

Pouvez-vous montrer un exemple? Il s'écroule toujours pour moi. –

+0

Ok, mais comment puis-je utiliser doc plus tard? Je veux assigner cette chaîne à un email plus tard: self.emailData = [doc dataUsingEncoding: NSUTF8StringEncoding]; qui maintenant se bloque. –

+0

Vous devez lire votre gestion de la mémoire Objective-C. Vous ne comprenez pas comment cela fonctionne. Voir: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html –