2013-10-20 130 views
0

我的遊戲有一個接收字符串的方法。自iOS7開始,它有時會崩潰。檢查變量是否包含內存地址

在該方法中,我在該字符串上調用lowercaseString,然後它與EXC_BAD_ACCESS崩潰。

-(void)changeDirection:(NSString *)_direction { 
    if (![[direction lowercaseString] isEqualToString:[_direction lowercaseString]]) { 

    } 
} 

東西,我注意到的是,這時候,這串似乎是一個內存地址

enter image description here

這就解釋了爲什麼會崩潰 - 我在記憶調用lowercaseString地址。

現在,最合理的解決方案是查看爲什麼此方法接收內存地址而不是實際的字符串,我猜。

但是,現在,我希望做一個快速的解決方法,這導致了這個問題:

如何檢測給定參數是否像@"Hello" 或內存地址的實際字符串對象?

+0

可能是一個已經發布的NSString –

+4

在Objective-C中,所有對象都通過它們的內存地址進行傳遞,所以不存在檢測參數是字符串對象還是內存地址的情況。最有可能'_direction'要麼沒有被初始化,要麼被分配給它,但它指向的對象被刪除。 – user1118321

回答

3

對象生活在堆上,你調用NSString實際上是一個指向它的指針。而指針是內存地址,所以這是預期的行爲不成問題。

EXC_BAD_ACCESS意味着您正在以不良方式訪問內存,即您指向的內存地址不是有效內存。

當您嘗試訪問懸掛指針(即指向已釋放對象的指針)或未初始化的指針時,可能會發生這種情況。

錯誤不在您發佈的代碼中,而是在產生該方法的參數_direction的代碼中。

+0

如何判斷_direction中的任何謊言是否已被初始化? (除了讓應用程序崩潰lol) – Voldemort

+1

您無法檢測到懸掛或未初始化的指針。你必須仔細閱讀代碼,看看是否有一條路徑導致錯誤的行爲。靜態分析儀在這種情況下有很多幫助。另外,你使用的是ARC嗎? –

+0

我沒有使用ARC。謝謝你! – Voldemort

相關問題