2009-04-16 1 views
0

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

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

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

+0

Я понял, когда я объявлял свойство sendData в своем заголовочном файле appDelegate , Я не использовал «сохранить», но я изменил это и до сих пор получаю ошибку. Странно то, что я использую другие свойства так же, как этот, и это единственный, который дает ошибку. – Dutchie432

ответ

2

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

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

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

  1. Добавить больше точек разрыва
  2. Добавить еще NSLog (..)
  3. Рассмотрим перехват исключений (см throwing an exception in objective-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 (![sendData isEqualToString:@"-"]){...}

Ошибка возникает, когда вы возвращаете форму вызова метода.


Ok формы вы комментарии, это может помочь:

При создании строки с помощью @"My string" компилятор будет отображать их на он же памяти, если они имеют одинаковое содержание, то есть:

NSString *var1 = @"string1"; 
NSString *anotherstring = @"string1"; 
NSString *morestringivars = @"string1"; 

Все будут указывать на то же пространство памяти.

Это может помочь, но я не уверен, как это сделать? Возможно, вы можете разместить больше кода, чтобы я мог запускать его на моем компьютере.


Помните, что в начале цикла событий на iPhone создается резервный пул релизов.

Поэтому рекомендуется называть autorelease по sendData, как только вы назначаете его для ivar.

... 

[sendData autorelease]; 

... 
+0

Я был бы рад опубликовать код для загрузки, если вы хотите взглянуть. – Dutchie432

+0

На самом деле код НЕ пропускает оператор IF, когда я включаю ELSE ... – Dutchie432

+0

Это определенно работает в моей системе. Странный. – rjstelling

1

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

+0

Я не уверен, почему это было бы. sendData является свойством AppDelegate и вообще не освобождается (мной). Также, если объект был освобожден, я все еще вижу его значение в отладчике? – Dutchie432

+0

Получаете или создаете данные в sendData? Если это так, вам может потребоваться сохранить. – rjstelling

+0

Я создаю данные как: sendData = @ "-"; – Dutchie432

0

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

0

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

если ([AppVersion isNotEqualTo: CurrentVersion])

"isNotEqualTo" поддерживается на Mac OS X 10.x или более поздней версии, но не на iPhone OS. поэтому вызов этого вызывает исключение на устройстве. теперь я надеюсь, что вы получите все, вместо этого измените свою логику сравнения, если (! [appVersion isEqualToString: currentVersion]), я думаю, что она будет работать нормально.

Смежные вопросы