2012-08-23 69 views
1

我有一個const字符串文字被損壞。常量全局字符串文字損壞

奇怪的是,根據安裝的XCode的版本,它顯然有不同的表現(我必須做幾個實驗,然後我才能100%確認這一點),但即使它不是Xcode,我想知道原因可能是什麼。

如果完全相同的代碼運行在完全相同的手機上,但是一次運行它連接到運行Xcode 3.3.3的筆記本電腦,則會出現此問題,如果使用不同的筆記本電腦運行相同的代碼和手機XCode 4.3.2或4.4安裝然後問題不顯示。

的問題是這樣的:

HeaderFile.h 
extern NSString* const kValue; 

HeaderFile.m 
NSString* const kValue = @"Some Value"; 

OtherFile.m 
#import "HeaderFile.h" 
... 
NSLog(@"Value is: %@", kValue); 

當連接到筆記本電腦的Xcode 4.3.3然後將該值記錄或觀察到全局常量調試時被損壞。

任何想法這可能是什麼?

作爲一個常量字面值,如果我的代碼中存在錯誤,它不應該被潦草寫過。

更新: 我檢查kValue的價值didFinishLaunchingWithOptions後:被調用其已經在這一點損壞,所以沒有機會爲我的代碼亂寫就可以了,即使是scribable。

+0

閱讀此:http://stackoverflow.com/questions/4354423/explanation-of-constants – bryanmac

+0

由於一些加載器怪癖(或由於簡單地沒有包括在內),常量的初始化程序很可能永遠不會被調用HeaderFile.m在你的應用程序中)。 –

回答

1

作爲一個常量文字,如果我的代碼中存在一個錯誤,它不應該被潦草寫過。

這並非完全正確。

首先,const甚至可以通過簡單的轉換來刪除。其次,如果你有一個嚴重的錯誤,你可能會寫入存儲變量的內存,因爲你正在訪問另一個變量的內存(例如,如果你輸入short的地址並將其轉換爲long*類型,那麼訪問它)。第三你有指針本身聲明const,但指向的數據不是const(至少不是根據聲明)。

另一方面,一般來說,你所觀察到的是不可能的。經常聲明const的全局變量被放在只能在運行時讀取的內存區域中。但並非所有硬件都允許這樣做,編譯器沒有真正的要求。通常,字符串文字也被認爲是const,這意味着實際上您指向的內容也可以存儲在const區域中(即使指針不是const)。

我不知道你爲什麼觀察到這種行爲,我不知道編譯器和iPhone硬件的內部結構,所以我不能說因爲一個錯誤而修改數據實際上是不可能的。但我知道,通過語言規則,編譯器(和硬件)將所有內容存儲在可修改區域是完全合法的。如果這就是他們所做的,那麼是的,一個錯誤可能是問題所在。

+0

我在didFinishLaunchingWithOptions之後立即檢查了kValue的值:被調用並且在那時已經被破壞,因此即使它是可擦洗的,我的代碼也沒有機會在它上面塗寫。任何想法,我可以做些什麼來試圖達到這個底部? – Gruntcakes

+0

它甚至早於此損壞嗎? 'main'進入的時候是什麼? –

+0

也有。我不能在另一臺筆記本電腦上使用相同的設置來重現這一點,所以我傾向於認爲Xcode安裝有一些問題(這不會是第一次),而不是代碼的內在錯誤。所以我要卸載/重新安裝,看看它有什麼結果。感謝您的回覆。 – Gruntcakes