2009-04-16 50 views
0

我有一行代碼導致「EXC_BAD_ACCESS」錯誤。代碼行如下(格式化爲一行,爲便於閱讀,刪除了嵌套代碼)。iPhone SDK - 字符串比較

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

實際的錯誤發生在IF線上。奇怪的是,如果我在該行上放置了一個斷點,則NSString調用sendData(顯示爲NSCFString,值爲「 - 」,不帶引號)。爲什麼會造成錯誤?請指教。

+0

我意識到當我聲明屬性sendData在我的appDelegate頭文件,我沒有使用'保留' - 但我改變了這一點,但仍然收到錯誤。奇怪的是,我正在使用其他屬性,就像這個一樣,這是唯一一個產生錯誤的方法。 – Dutchie432 2009-04-16 14:51:44

回答

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()語句,你可以看到它通過if (![sendData isEqualToString:@"-"]){...}

從方法調用返回時發生錯誤。您的意見


好形式,這可能幫助:

,如果您使用@"My string"編譯器,如果他們有相同的內容,也就是將這些映射到他相同存儲器串:

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

都會指向相同的內存空間。

這可能有幫助,但我不知道如何?也許你可以發佈更多的代碼,所以我可以在我的設置上運行它。


記住一個自動發佈池是在iPhone上的事件循環開始時創建的。

因此,只要您將它分配給伊娃,在sendData上調用autorelease是一個好主意。

... 

[sendData autorelease]; 

... 
1

聽起來好像你正試圖發送一條消息給一個內存已被釋放的對象。確保您遵循Memory Management Programming Guide for Cocoa中討論的正確內存管理技術。解決方案可能是在它被釋放之前添加一個[sendData retain],但要理解它的工作原理,您必須閱讀上述指南。

+0

林不知道爲什麼會這樣。 sendData是AppDelegate的一個屬性,並沒有被解除分配(我)。另外,如果對象被釋放,我仍然可以在調試器中看到它的值嗎? – Dutchie432 2009-04-16 14:09:54

+0

您是否在sendData中獲取或創建數據?如果是這樣,你可能需要保留。 – rjstelling 2009-04-16 14:15:50

0

將發佈後的對象設置爲零,以防止向非可用對象發送消息時發生崩潰。

0

曼問題是在這條線

如果([appVersion isNotEqualTo:CURRENTVERSION])

「isNotEqualTo」 在MAC支持OS X 10.X或更高但不能在iphone OS。因此調用此設備會導致異常。現在我希望你得到的全部點,而不是改變你的比較邏輯,如果(![appVersion isEqualToString:currentVersion]),我認爲它會工作正常..