Чтобы решить эту проблему, вам нужно поставить точки останова во всех методах обратного вызова.
Проблема проста, код пытается получить доступ к памяти, которую не может найти.
Найти эту строку кода сложнее, потому что обратные вызовы не вызываются последовательно.
- Добавить больше точек останова
- Добавить еще NSLog (..)
- Подумайте о перехвате исключений (см. Использование исключения в target-c / cocoa )
Вывод из консоли:
Attaching to program: `/Users/rjstelling/Library/Application Support/iPhone Simulator/User/Applications/C04A40BB-1D98-402E-BBEF-37E6FB860089/TwoViewApp.app/TwoViewApp', process 24032.
Re-enabling shared library breakpoint 1
2009-04-16 16:16:45.830 TwoViewApp[24032:20b] stream event 1
2009-04-16 16:16:45.831 TwoViewApp[24032:20b] on input stream
2009-04-16 16:16:45.831 TwoViewApp[24032:20b] stream event 1
2009-04-16 16:16:45.832 TwoViewApp[24032:20b] on output stream
2009-04-16 16:16:45.832 TwoViewApp[24032:20b] stream event 4
2009-04-16 16:16:45.832 TwoViewApp[24032:20b] on output stream
2009-04-16 16:16:45.833 TwoViewApp[24032:20b] stream has space open
(gdb) continue
2009-04-16 16:17:06.405 TwoViewApp[24032:20b] We made it - ok!
2009-04-16 16:17:06.406 TwoViewApp[24032:20b] stream event 2
2009-04-16 16:17:06.406 TwoViewApp[24032:20b] on input stream
2009-04-16 16:17:06.407 TwoViewApp[24032:20b] Processing: +OK CONN PinkNotes® Plus Master v5.00.26 Beta (v4 compatible)
:tPNPStr
2009-04-16 16:17:06.407 TwoViewApp[24032:20b] SendData= USER (null):tPNPStr
Current language: auto; currently objective-c
Program received signal: “EXC_BAD_ACCESS”.
(gdb)
Проблема возникает где-то в или после ProcessData
, который, я думаю, является обратным вызовом. Попробуйте установить точку останова вокруг линии 157 в TwoViewAppAppDelegate.m
Это не та строка, которая вызывает EXC_BAD_ACCESS
, если вы добавите:
else
{
NSLog(@"We made it - ok!");
}
В операторе if () вы можете видеть, что он проходит над if ( ![sendData isEqualToString:@"-"] ){...}
Ошибка возникает при возврате из вызова метода.
Хорошо, если вы пишете комментарии, это может помочь:
Если вы создаете строки с использованием @"My string"
, компилятор сопоставит их с той же памятью, если они имеют одинаковое содержимое, т.е.
NSString *var1 = @"string1";
NSString *anotherstring = @"string1";
NSString *morestringivars = @"string1";
Все они будут указывать на одно и то же пространство памяти.
Это может помочь, но я не уверен, как? Может быть, вы можете опубликовать больше кода, чтобы я мог запустить его на моем устройстве.
Помните, что автоматический пул релизов создается в начале цикла событий на iPhone.
Поэтому рекомендуется вызывать autorelease для sendData, как только вы назначите его для ivar.
...
[sendData autorelease];
...