2011-03-26 27 views
0

我有类,它有一个NSString。NSString在初始化方法中超出范围

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

当我在init方法通过调试器看着requiredMusic_可变它写了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]; 
... 
} 

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

回答

1

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

您可以尝试重新编译并禁用优化。根据编译器的不同,可能会对一些文件的一部分禁用优化功能,其中一些#pragma(对于在4.4版本中引入的GCC)。

+0

我该如何禁用优化? – Andrew 2011-03-26 17:04:16

+0

用'-O0'编译。 – 2011-03-27 10:28:49

0

Sylvain说了些什么。但是...

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

不要这样做!你将会得到一个返回值的地址,这个返回值几乎可以保证完全不是你想要的,我很惊讶编译器甚至编译它。

+0

这里一切都很好。 AudioData()正在返回引用。所以我正在接受一个真正的变量的地址。不是副本。 \t const AudioData&audioData()const {return audio_;} – Andrew 2011-03-26 17:02:27

+0

它仍然是一个非常奇怪的设计。也是脆弱的。您正在有效地撕开几层封装。如果你真的想拥有一个变量的地址,你应该有API来直接返回这个地址,并且不需要在调用者中抓取它。这种方式不那么脆弱(没有看到更多的代码,很难说更多)。 – bbum 2011-03-26 19:06:47

+0

这是我正在这样做的代码的唯一部分。只保留一个指向变量的指针以便直接访问。在C++中,我将对此变量进行const引用,并在构造函数中初始化它。但我不能在objective-c中做到这一点。 – Andrew 2011-03-26 20:46:17