NSString超出了init方法的范围

时间:2011-03-26 15:07:14

标签: objective-c nsstring

我有一个类,它有一个NSString。

@interface AudioManager : NSObject {
    AudioData *data_;
    NSString *requiredMusic_;
    NSTimer *timer_;
    MUSIC_ID musicId_;
    float fadeIncrement_;
}

当我在requiredMusic_方法中通过调试器查看init变量时,它写为NSCFString ... out of scope。但是,如果我将从self看这个变量,那么它将被写为零!

-(id) init
{
    self = [super init];
    if (self)
    {
        data_ = &[[GameDataObject sharedObject] data]->audioData();
        requiredMusic_ = @"bla bla bla";
        musicId_ = MUSIC_OTHER;
    }
    return self;
}

Out of scope也写在其他地方,我的代码没有按预期工作。有什么问题?

-(void) changeBackgroundMusic:(NSString *)path
{
    [requiredMusic_ release];
    requiredMusic_ = path;
    [requiredMusic_ retain];
...
}

在上面的代码中,它也超出了范围。

2 个答案:

答案 0 :(得分:1)

您可能正在调试在启用优化的情况下编译的程序版本。在优化代码中,某些变量可能无法通过调试器访问,因为在编译编译器时发现在当前函数中可以减少变量作用域而不改变语义,并且它只是为了改进代码(减少寄存器使用或内存)访问,...)。

您可以尝试在禁用优化的情况下重新编译它。根据编译器的不同,可以仅针对某些#pragma的文件禁用优化(对于GCC,这是在4.4版中引入的)。

答案 1 :(得分:0)

西尔万说的话。但...

    data_ = &[[GameDataObject sharedObject] data]->audioData();

不要那样做!你将获取一个返回值的地址,这个地址几乎可以保证根本不是你想要的,我很惊讶编译器甚至编译它。