iPhone SDK - Сравнение строк - PullRequest
0 голосов
/ 16 апреля 2009

У меня есть строка кода, которая вызывает ошибку «EXC_BAD_ACCESS». Строка кода выглядит следующим образом (отформатирован в одну строку, а вложенный код удален для удобства чтения).

if (![sendData isEqualToString:@"-"]){ ... }

Фактическая ошибка возникает в строке IF. странным является то, что если я поставлю точку останова на этой строке, NSString будет вызывать sendData (отображается как NSCFString со значением «-» без кавычек). Почему это вызывает ошибку? Пожалуйста, сообщите.

Ответы [ 4 ]

2 голосов
/ 16 апреля 2009

Чтобы решить эту проблему, вам нужно поставить точки останова во всех методах обратного вызова.

Проблема проста, код пытается получить доступ к памяти, которую не может найти.

Найти эту строку кода сложнее, потому что обратные вызовы не вызываются последовательно.

  1. Добавить больше точек останова
  2. Добавить еще NSLog (..)
  3. Подумайте о перехвате исключений (см. Использование исключения в 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];

...
1 голос
/ 16 апреля 2009

Похоже, вы пытаетесь отправить сообщение объекту, чья память была освобождена. Убедитесь, что вы используете правильные методы управления памятью, описанные в Руководство по программированию управления памятью для какао . Исправление, вероятно, заключалось бы в добавлении [sendData retain] в какой-то момент до его освобождения, но чтобы понять, почему это работает, вы должны прочитать вышеупомянутое руководство.

0 голосов
/ 21 мая 2009

Человек, проблема в этой строке

if ([appVersion isNotEqualTo: currentVersion])

«isNotEqualTo» поддерживается в Mac OS X 10.X или более поздней версии, но не в ОС iphone. так что вызов этого вызывает исключение на устройстве. теперь я надеюсь, что вы поймете всю суть вместо того, чтобы изменить логику сравнения на if (!

0 голосов
/ 17 апреля 2009

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

...