我的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连接到笔记本电脑时,在调试全局常量时记录或观察到的值已损坏。
任何想法如何?
作为一个常量文字,如果我的代码中存在错误,就不应该对它进行潦草地写下来。
更新: 我在didFinishLaunchingWithOptions:被调用后立即检查了kValue的值,并且在那时它已经被破坏了,所以我的代码没有机会在它上面乱写,即使它是可以写的。
答案 0 :(得分:1)
作为一个常量文字,如果我的代码中存在错误,就不应该对其进行潦草书写。
这不完全正确。
首先,const甚至可以通过简单的强制转换删除。第二,如果你有一个严重的错误,你可能会写入存储变量的内存,因为你访问的是另一个变量的内存(例如,如果你取一个short
的地址并将其转换为类型long*
然后访问它)。第三,你有指针本身声明为const,但指向的数据不是const(至少不是根据声明)。
另一方面,一般来说,你观察到的事情是不可能的。通常声明为const的全局变量被放入一个只在运行时读取的内存区域。但并非所有硬件都允许这样做,并且编译器没有真正要求这样做。通常,字符串文字也被认为是const,这意味着实际上你指向的内容也可以存储在const区域中(即使指针不是const)。
我不知道为什么你会观察到这种行为,我不知道编译器和iPhone硬件的内部结构,所以我不能说是否因为一个bug而修改那些数据实际上是不可能的。但我知道,通过语言规则,编译器(和硬件)将所有内容存储在可修改的区域是完全合法的。如果这就是他们所做的,那么是的,一个错误可能就是问题。