2012-08-23 70 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