2011-03-26 4 views
0

NSString이있는 클래스가 있습니다. 초기화 메서드에서 NSString 범위를 벗어남

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

는 내가 그것을 NSCFString ... out of scope 것을 쓰여 init 방법에 디버거를 통해 requiredMusic_ 변수를 찾고 있어요합니다. 그러나 내가 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 (GCC의 경우 버전 4.4에서 도입 된 파일)의 일부분 만 최적화를 비활성화 할 수 있습니다.

+0

어떻게 최적화를 비활성화 할 수 있습니까? – Andrew

+0

'-O0'로 컴파일하십시오. –

0

실뱅이 말한 바. 하지만 ...

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

Do not do that! 당신은 반환 값의 주소를 취하게 될 것이고 이것은 여러분이 원하는 것과 같지 않게 보장됩니다. 컴파일러가 그것을 컴파일하는 것조차도 놀랍습니다.

+0

모든 것이 여기에서 좋습니다. AudioData()가 참조를 반환합니다. 그래서 저는 실제 변수의 주소를 취하고 있습니다. 복사본이 아닙니다. \t const AudioData & audioData() const {return audio_;} – Andrew

+0

여전히 이상한 디자인입니다. 깨지기 쉽다. 캡슐화의 몇 가지 레이어를 효과적으로 제거하고 있습니다. 변수의 주소를 정말로 갖고 싶다면 직접 주소를 반환하는 API가 있어야하며 호출자가 주소를 가져야합니다. 훨씬 덜 깨지기 쉬운 방법입니다 (코드를 더 많이 보지 않고 더 많이 말하기는 어렵습니다). – bbum

+0

이것은 내가하는 코드의 유일한 부분입니다. 변수에 대한 포인터가 직접 액세스 할 수 있도록하는 것입니다. C++에서는이 변수에 대한 const 참조를 만들고 생성자에서 초기화합니다. 그러나 나는 객관적으로 이것을 할 수 없다. – Andrew

관련 문제