2010-03-02 10 views
5

J'ai reçu un message EXC_BAD_ACCESS dans ma console. J'ai lu sur les variables d'environnement NSZombieEnabled et MallocStackLoggingNoCompact sur this site. J'ai créé mes variables d'environnement: NSZombieEnabled = OUI et MallocStackLoggingNoCompact = 1. Dans la console, j'ai vuMise au point de EXC_BAD_ACCESS à partir d'un NSString

2010-03-01 19: 13: 46,924 CruzNomad [7952: 207] *** - [CFString stringByAddingPercentEscapesUsingEncoding:]: message envoyé à l'instance désallouées 0x58448e0

Puis au prompt (gdb), je l'ai d'info malloc-histoire 0x58448e0, ce qui m'a donné:

Alloc: Block address: 0x058448e0 length: 64 
Stack - pthread: 0xa0b33500 number of frames: 25 
    0: 0x98e089bc in malloc_zone_malloc 
    1: 0x21516aa in _CFRuntimeCreateInstance 
    2: 0x2152bf8 in __CFStringCreateImmutableFunnel3 
    3: 0x21567d9 in CFStringCreateCopy 
    4: 0x21742fc in _CFStringCreateWithFormatAndArgumentsAux 
    5: 0xdb546 in -[NSPlaceholderString initWithFormat:locale:arguments:] 
    6: 0xdb4d8 in +[NSString stringWithFormat:] 
    7: 0x23aa3 in -[BuisnessCardViewController viewDidLoad] at /Users/.../Classes/BuisnessCardViewController.m:85 
    8: 0x3d6796 in -[UIViewController view] 
    9: 0x347b4 in -[gm_menuViewController btn5_Pressed:] at /Users/.../Classes/menuViewController.m:535 
    10: 0x357459 in -[UIApplication sendAction:to:from:forEvent:] 
    11: 0x3baba2 in -[UIControl sendAction:to:forEvent:] 
    12: 0x3bcdc3 in -[UIControl(Internal) _sendActionsForEvents:withEvent:] 
    13: 0x3bbb0f in -[UIControl touchesEnded:withEvent:] 
    14: 0x370e33 in -[UIWindow _sendTouchesForEvent:] 
    15: 0x35a81c in -[UIApplication sendEvent:] 
    16: 0x3610b5 in _UIApplicationHandleEvent 
    17: 0x2984ed1 in PurpleEventCallback 
    18: 0x2197b80 in CFRunLoopRunSpecific 
    19: 0x2196c48 in CFRunLoopRunInMode 
    20: 0x298378d in GSEventRunModal 
    21: 0x2983852 in GSEventRun 
    22: 0x362003 in UIApplicationMain 
    23: 0x2c8c in main at /Users/.../source/main.m:14 
    24: 0x2bfa in start 

La ligne 7 indique que le problème était dans la ligne 85 de BuisnessCardViewController.m. Cette ligne est ici:

fullAddress = [NSString stringWithFormat:@"%@ %@", fullAddress, myString]; 

Je suis annexant le contenu fullAddress et myString et son stockage retour dans fullAddress.

Si j'interprète cela correctement, il apparaît qu'après cette ligne, fullAddress est désaffectée. Lorsque je dépose un point d'arrêt et survole la variable, sa valeur indique "hors de portée".

fullAddress fonctionne plus tard dans cette méthode. Je l'utilise pour envoyer à Google pour le géocodage inverse à la ligne 164 de la même méthode.

NSString *urlString = [NSString stringWithFormat:@"http://maps.google.com/maps/geo?q=%@&output=csv", [fullAddress stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; 

Même ici, il est dit "hors de portée". Je suis perplexe ... un conseil?

Merci!

Thomas

+0

Pouvez-vous poster un peu plus de contexte? S'il dit que la variable est hors de portée, peut-on voir toute la portée? –

+0

Utilisez-vous 'fullAddress' ou' myString' ailleurs? – FelixLam

+0

Aussi, juste au cas où c'était un accident, vous avez mal orthographié Business comme Buisness. – dreamlax

Répondre

3

Dans la plupart des cas, cela se produit lorsque vous ne conserviez pas un attribut qui est l'objet et d'envoyer des messages à la fin dans d'autres méthodes, en retard.

Alors, où certaines chaînes sont initialisés essayer:

[fullAddress retain]; 

ou

[myString retain]; 

selon lequel est initialisé dans une autre méthode.

+0

Si la réponse n'est pas totalement claire, excusez-moi pour ma langue s'il vous plaît et écrivez commentaire ci-dessous. – mxg

1

Avez-vous essayé chaîne annexant au format?

fullAddress = [NSString stringWithFormat:@"%@ %@", fullAddress, myString]; 

avec:

- (NSString *)stringByAppendingFormat:(NSString *)format ... 

comme ceci:

[fullAddress stringByAppendingFormat:@" %@", myString]; 
+0

Merci pour les réponses, les gens. Et non, je ne savais pas que Business était mal orthographié. @dreamlax - Je n'ai pas écrit cette classe (heureusement mdr): -) ... Je travaille juste sur des fonctionnalités spécifiques. Merci de l'avoir signalé! J'ai trouvé mon problème. Comme stringWithFormat renvoie un objet autoreleased, je l'ai juste conservé juste après l'avoir utilisé pour la première fois plus tôt dans la méthode. [fullAddress retain]; fait l'affaire (comme je le vois maintenant mxg a suggéré). Encore une fois, merci à tous! -Thomas – Thomas