Objective c NSString在init方法中超出范围
我有一个类,它有一个字符串Objective c NSString在init方法中超出范围,objective-c,nsstring,Objective C,Nsstring,我有一个类,它有一个字符串 @interface AudioManager : NSObject { AudioData *data_; NSString *requiredMusic_; NSTimer *timer_; MUSIC_ID musicId_; float fadeIncrement_; } 当我在init方法中通过调试器查看requiredMusic变量时,NSCFString。。。超出范围。但是如果我从self看这个变量,那么它将被写
@interface AudioManager : NSObject {
AudioData *data_;
NSString *requiredMusic_;
NSTimer *timer_;
MUSIC_ID musicId_;
float fadeIncrement_;
}
当我在init
方法中通过调试器查看requiredMusic
变量时,NSCFString。。。超出范围
。但是如果我从self
看这个变量,那么它将被写为nil
-(id) init
{
self = [super init];
if (self)
{
data_ = &[[GameDataObject sharedObject] data]->audioData();
requiredMusic_ = @"bla bla bla";
musicId_ = MUSIC_OTHER;
}
return self;
}
超出范围
也在其他地方编写,我的代码无法按预期工作。有什么问题
-(void) changeBackgroundMusic:(NSString *)path
{
[requiredMusic_ release];
requiredMusic_ = path;
[requiredMusic_ retain];
...
}
在上面的代码中,它也超出了范围。您可能正在调试在启用优化的情况下编译的程序版本。在优化代码中,某些变量可能无法通过调试器访问,因为在编译编译器时发现,在当前函数中,变量范围可以在不更改语义的情况下缩小,并且这样做只是为了改进代码(减少寄存器使用或内存访问…)
您可以尝试在禁用优化的情况下重新编译它。根据编译器的不同,可以仅对带有一些
#pragma
的文件的一部分禁用优化(对于GCC,这是在4.4版中引入的)。Sylvain说的话。但是
data_ = &[[GameDataObject sharedObject] data]->audioData();
不要那样做!您将获取一个返回值的地址,这个地址几乎可以保证根本不是您想要的,我很惊讶编译器甚至编译了这个地址。这里一切正常。AudioData()正在返回引用。所以我要取一个实变量的地址。没有复印件。const AudioData&AudioData()const{return audio}这仍然是一个非常奇怪的设计。也很脆弱。您实际上是在剥离几层封装。如果你真的想要一个变量的地址,你应该有API直接返回这个地址,而不依赖于在调用者中获取它。这样就不那么脆弱了(没有看到更多的代码,很难说更多)。这是我正在做的代码的唯一部分。只需保留一个指向变量的指针即可直接访问。在C++中,我会对这个变量做一个常数引用,并在构造函数中初始化它。但我不能在objective-c中这样做。我如何禁用优化?