Objective-C:const char *字符串被破坏:发生了什么?

时间:2012-01-06 16:23:22

标签: objective-c c string

我遇到了一个奇怪的问题,即const char字符串在初始化后被破坏了。

在我的.m文件中,我有一个如此声明的指针:

const char *s;

@implementation MyClass
...
@end 

它在-init初始化,在那一点看起来很好:

-init 
{
    if (self = [super init]) {
        s = [@"obfuscatedString" deobfuscatedCString];
    }
    return self;
}

后来,当我来阅读它时,指针的地址没有改变,但是值被覆盖了。

我已经将它剥离到了基本要素,并且可以确认该字符串没有以其他方式使用,并且似乎没有任何其他可能会破坏它。

那么,发生了什么?是否有一些基本的目标-c我不知道?

非常感谢任何帮助。

5 个答案:

答案 0 :(得分:2)

你真的不给我们太多的信息,你知道:)。

我认为在任何情况下编码风格都很糟糕,所以我的建议如下:将S作为实例变量。真。

答案 1 :(得分:2)

这几乎可以肯定是因为你的C字符串的内存在某些时候被释放了。如果你绝对必须具有全局性(并且从你的构造函数初始化它听起来这可能不完全正确),请将其设为NSString *。它将保持其值,直到它被明确释放。每当需要转换为cStringUsingEncoding时,请使用char*

答案 2 :(得分:0)

您不会提供任何可以让我们了解正在发生的事情的代码,因此我们无法在此为您提供帮助。请提供更多详情。

但无论如何,即使你在你的问题中只编写了3行代码,这已经是可怕的编码风格了:

  • 您使用const char *,而NSString可能更适合与其他Cocoa对象一起使用
  • 您使用全局变量,这是非常糟糕的编码风格,可能会导致您遇到问题(如并发访问问题等)。请改用实例变量。真。
  • 你的变量名只有一个字符长,这是一个非常糟糕的习惯,并没有帮助使代码易于理解。像“S”这样的名字远非描述性的
  • 您将变量命名为以大写字母开头,而以大写字母开头的名称应保留为类名称,而实例变量应以小写字母标出。如果这是一个常量,它可能用全大写(而不是标题大小写),但是因为你的变量名只有1个字母长...无论如何...

简而言之,请确保您已阅读编程指南并立即使用良好习惯(如果不是绝对必要的话,请避免使用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]);