我的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连接到便携式计算机时,调试全局常量时记录或观察到的值将损坏。
有什么想法吗?
由于它是const字面量,因此如果我的代码中存在错误,则不可能对其进行乱写。
更新:
我在didFinishLaunchingWithOptions:被调用之后立即检查了kValue的值,并且该值在那时已经损坏了,因此即使它是可写的,我的代码也没有机会在上面写。
最佳答案
由于它是const字面量,因此如果我的代码中存在错误,则不可能对其进行乱写。
那不是完全正确的。
首先,甚至可以通过简单的强制转换将const删除。其次,如果您遇到一个严重的错误,则可能正在写入存储变量的内存,因为您正在访问另一个变量的内存之外(例如,如果您使用short
的地址并将其强制转换为然后访问它)。第三,您将指针本身声明为const,但指向的数据不是const(至少不是根据声明)。
另一方面,总的来说,您观察到的事实是不可能的。通常,将声明为const的全局变量放入仅在运行时读取的内存区域。但是并不是所有的硬件都允许这样做,并且编译器也没有真正的要求。通常,字符串文字也通常被视为const,这意味着实际上您指向的内容也可以存储在const区域中(即使指针不是const)。
我不知道为什么您会观察到这种行为,而且我也不知道编译器和iPhone硬件的内部,所以我不能说是否由于错误而实际上不可能修改该数据。但是我知道,根据语言规则,编译器(和硬件)将所有内容存储在可修改区域中是完全合法的。如果那是他们的工作,那么是的,可能是一个错误。
关于objective-c - const全局字符串文字已损坏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12083765/