2009-06-11 8 views
0

아이폰 앱에서 NSDate의 범위를 벗어난 문제가 있습니다. 실제로 변수의 checkThis을 할당하기 전에 내가 초기화를 통해 추적 경우, 지금범위를 벗어난 NSDate

-(id) init 
{ 
    if((self=[super init])) { 
     checkThis = NO; 
     array = [[NSMutableArray alloc] init]; 
     nextDue = [[NSDate date] retain]; 


       NSDate *testDate = [NSDate date]; 
    } 
    return self; 
} 

:

I는 다음과 같이 정의 된 인터페이스를 가지고 구현 지금

@interface MyObject : NSoObject { 
    NSMutableArray *array; 
    BOOL  checkThis; 
    NSDate  *nextDue; 

} 

을 나는이 있습니다 부울로 표시됩니다. 배열은 할당되지 않았기 때문에 0x0 포인터로 표시됩니다. 하지만 nextDue는 '범위를 벗어남'으로 표시됩니다. 이것이 범위를 벗어나는 이유는 모르지만 다른 변수는 이해할 수 없습니다.

변수가 할당 될 때까지 코드를 추적하면 배열에 올바르게 할당 된 것으로 표시되지만 nextDue는 여전히 범위를 벗어납니다. 흥미롭게도, testDate 변수는 잘 할당되고 디버거는이를 유효한 날짜로 표시합니다.

또 다른 흥미로운 점은 내가 디버깅하는 동안 testDate 변수 위로 마우스를 움직이면 그 정의 이후로 기대할 수있는 'NSDate *'유형으로 표시된다는 것입니다. 그러나 나에게 정의 된 nextDue는 '_NSCFDate *'로 표시됩니다.

내가 주제에 대해 수행 한 모든 문제는 문제가 아니지만 변수를 할당하기 전에 실제로 범위를 벗어났습니다.

그러나 다른 클래스에서는 NSDate와 동일한 정의가 적용됩니다. 값이 할당되기 전에는 nil로 표시됩니다. Arghhh

답변

1

또한 iphone dev 포럼에이 질문을 게시했습니다. 내가 가진 대답은 옳은 것 같다. 기본적으로 디버거에서 우스운 일입니다. 사실, 그 시간을 내가 보냈던 시간을 생각해 보면 그렇게 재미 있지 않습니다. 변수의 결과를보기 위해 NSLog를 사용할 때 실제로 값을 올바르게 표시합니다.

NSDate 대 _NSCFDate 문제는 무료 브리지 인 Stephen이 말한 것입니다.

0

왜 gdb가 날짜가 범위를 벗어 났다고 말하고 있는지 모르겠지만 retain을 제거하십시오. [NSDate date]는 보유를 요구하지 않습니다.

0

나는 디버깅 할 때 이런 동작을 보았으며 릴리스 모드에서 바이너리를 컴파일하고 있다는 것을 잊어 버렸다.

또한 Xcode에서 지연 심볼로드가 비활성화되었는지 확인해야합니다.

0

여기에 몇 가지 질문이 있습니다.

첫째로, 은 0x0에 대한 포인터이고 다른 하나는 init이 완료되기 전입니까? 글쎄, 그들은 초기화되지 않았습니다! 그들의 값은 당신이 초기화 할 때까지 의지 할 수 없습니다. 그 중 일부가 nil (0x0)이라는 사실은 여러분이 의지해야하는 것이 아닙니다.

둘째, nextDue이 올바르게 지정되지 않았습니까? 이것은 컴파일러의 최적화와 같습니다. 디버그 모드 (즉, 최적화 기능 없음) 상태인지 확인하십시오. init 메서드가 완료되고 반환 된 후 나중에 값이 무엇인지 확인하십시오. 초기화를 [[NSDate alloc] init]으로 변경하면 값을 유지할 필요가 없습니다.

세 번째 : NSDate_NSCFDate. 기본적으로 NSDate에는 CFDate (동일한 것의 하위 레벨, C와 유사한 API)이있는 "수신자 부담"브리지가 있습니다. 컴파일러는 분명히 코드에서 정의 된 버전이 아닌 CoreFoundation 버전을 표시하려고 선택합니다. 큰 문제는 아닙니다. 나는 그것에 대해 걱정하지 않을 것이다.

관련 문제