我有一行代碼導致「EXC_BAD_ACCESS」錯誤。代碼行如下(格式化爲一行,爲便於閱讀,刪除了嵌套代碼)。iPhone SDK - 字符串比較
if (![sendData isEqualToString:@"-"]){ ... }
實際的錯誤發生在IF線上。奇怪的是,如果我在該行上放置了一個斷點,則NSString調用sendData(顯示爲NSCFString,值爲「 - 」,不帶引號)。爲什麼會造成錯誤?請指教。
我有一行代碼導致「EXC_BAD_ACCESS」錯誤。代碼行如下(格式化爲一行,爲便於閱讀,刪除了嵌套代碼)。iPhone SDK - 字符串比較
if (![sendData isEqualToString:@"-"]){ ... }
實際的錯誤發生在IF線上。奇怪的是,如果我在該行上放置了一個斷點,則NSString調用sendData(顯示爲NSCFString,值爲「 - 」,不帶引號)。爲什麼會造成錯誤?請指教。
爲了解決這個問題,你必須在所有的回調方法中加入斷點。
問題很簡單,代碼試圖訪問它無法找到的內存。
查找該代碼行比較困難,因爲回調沒有按順序調用。
輸出格式控制檯:
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];
...
聽起來好像你正試圖發送一條消息給一個內存已被釋放的對象。確保您遵循Memory Management Programming Guide for Cocoa中討論的正確內存管理技術。解決方案可能是在它被釋放之前添加一個[sendData retain]
,但要理解它的工作原理,您必須閱讀上述指南。
林不知道爲什麼會這樣。 sendData是AppDelegate的一個屬性,並沒有被解除分配(我)。另外,如果對象被釋放,我仍然可以在調試器中看到它的值嗎? – Dutchie432 2009-04-16 14:09:54
您是否在sendData中獲取或創建數據?如果是這樣,你可能需要保留。 – rjstelling 2009-04-16 14:15:50
將發佈後的對象設置爲零,以防止向非可用對象發送消息時發生崩潰。
曼問題是在這條線
如果([appVersion isNotEqualTo:CURRENTVERSION])
「isNotEqualTo」 在MAC支持OS X 10.X或更高但不能在iphone OS。因此調用此設備會導致異常。現在我希望你得到的全部點,而不是改變你的比較邏輯,如果(![appVersion isEqualToString:currentVersion]),我認爲它會工作正常..
我意識到當我聲明屬性sendData在我的appDelegate頭文件,我沒有使用'保留' - 但我改變了這一點,但仍然收到錯誤。奇怪的是,我正在使用其他屬性,就像這個一樣,這是唯一一個產生錯誤的方法。 – Dutchie432 2009-04-16 14:51:44