我遇到了一个奇怪的问题,即const char字符串在初始化后被破坏了。
在我的.m文件中,我有一个如此声明的指针:
const char *s;
@implementation MyClass
...
@end
它在-init
初始化,在那一点看起来很好:
-init
{
if (self = [super init]) {
s = [@"obfuscatedString" deobfuscatedCString];
}
return self;
}
后来,当我来阅读它时,指针的地址没有改变,但是值被覆盖了。
我已经将它剥离到了基本要素,并且可以确认该字符串没有以其他方式使用,并且似乎没有任何其他可能会破坏它。
那么,发生了什么?是否有一些基本的目标-c我不知道?
非常感谢任何帮助。
答案 0 :(得分:2)
你真的不给我们太多的信息,你知道:)。
我认为在任何情况下编码风格都很糟糕,所以我的建议如下:将S作为实例变量。真。
答案 1 :(得分:2)
这几乎可以肯定是因为你的C字符串的内存在某些时候被释放了。如果你绝对必须具有全局性(并且从你的构造函数初始化它听起来这可能不完全正确),请将其设为NSString *
。它将保持其值,直到它被明确释放。每当需要转换为cStringUsingEncoding
时,请使用char*
。
答案 2 :(得分:0)
您不会提供任何可以让我们了解正在发生的事情的代码,因此我们无法在此为您提供帮助。请提供更多详情。
但无论如何,即使你在你的问题中只编写了3行代码,这已经是可怕的编码风格了:
简而言之,请确保您已阅读编程指南并立即使用良好习惯(如果不是绝对必要的话,请避免使用char*
类型的全局常量),否则会导致错误(如内存损坏)以后调试。如果您希望我们帮助解决原始问题,请使用更多代码。
答案 3 :(得分:0)
听起来有些东西在某些时候与指针或其内容相混淆。我将常量包装在类方法中,并确保只在其中修改它。像这样:
+ (const char *)globalCString
{
static const char *s = NULL;
if (!s) s = [@"obfuscatedString" deobfuscatedCString];
return s;
}
答案 4 :(得分:0)
在去混淆时,deobfuscatedCString
是否使用自动释放对象?也许返回的地址指向当其中一个被释放时释放的内存。
如果是这种情况,您仍希望s
成为char *
,请尝试:
s = strdup([@"obfuscatedString" deobfuscatedCString]);