Отладка EXC_BAD_ACCESS из NSString

У меня было сообщение EXC_BAD_ACCESS в моей консоли. Я прочитал о переменных среды NSZombieEnabled и MallocStackLoggingNoCompact на этом сайте. Я создал свои переменные среды: NSZombieEnabled = YES и MallocStackLoggingNoCompact = 1. В консоли я увидел

2010-03-01 19:13:46.924 CruzNomad[7952:207] *** -[CFString stringByAddingPercentEscapesUsingEncoding:]: сообщение отправлено освобожденному экземпляру 0x58448e0

Затем в приглашении (gdb) я сделал info malloc-history 0x58448e0, что дало мне:

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

В строке 7 говорится, что проблема была в строке 85 файла BuisnessCardViewController.m. Эта строка здесь:

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

Я добавляю содержимое fullAddress и myString и сохраняю его обратно в fullAddress.

Если я правильно это интерпретирую, получается, что после этой строки fullAddress освобождается. Когда я опускаю точку останова и навожу указатель мыши на переменную, ее значение говорит «вне области действия».

fullAddress работает позже в этом методе. Я использую его для отправки в Google для обратного геокодирования в строке 164 того же метода.

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

Даже здесь написано "вне сферы действия". Я в тупике... есть советы??

Спасибо!

Томас


person Thomas    schedule 02.03.2010    source источник
comment
Можете ли вы опубликовать немного больше контекста? Если он говорит, что переменная вышла за пределы области видимости, можем ли мы увидеть всю область видимости?   -  person Dave DeLong    schedule 02.03.2010
comment
Используете ли вы fullAddress или myString где-нибудь еще?   -  person Felix Lamouroux    schedule 02.03.2010
comment
Кроме того, на случай, если это был несчастный случай, вы неправильно написали Бизнес как Бизнес.   -  person dreamlax    schedule 02.03.2010


Ответы (2)


В большинстве случаев это происходит, когда вы не сохраняете атрибут, который является объектом, и отправляете ему поздние сообщения в других методах, поздних.

Итак, где некоторые строки инициализированы, попробуйте:

[fullAddress retain];

or

[myString retain];

в зависимости от того, какой из них инициализируется другим методом.

person mxg    schedule 02.03.2010
comment
Если ответ не совсем ясен, извините меня за мой язык, пожалуйста, и напишите ниже комментарий. - person mxg; 02.03.2010

Вы пробовали добавить строку в формат?

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

с участием:

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

нравится:

[fullAddress stringByAppendingFormat:@" %@", myString];
person stefanB    schedule 02.03.2010
comment
Спасибо за ответы, народ. И нет, я не знал, что слово «Бизнес» было написано неправильно. @dreamlax - я не писал этот класс (к счастью, лол) :-) ... Я просто работаю над конкретными функциями. Спасибо, что указали на это, хотя! Я понял свою проблему. Поскольку stringWithFormat возвращает объект с автоматическим выпуском, я просто сохранил его сразу после того, как впервые использовал его ранее в методе. [полный адрес сохранить]; сделал свое дело (как я теперь вижу, mxg предложил). Еще раз спасибо всем! -Томас - person Thomas; 02.03.2010