2011-03-05 6 views
1

를 반환 내가 중단 점을 설정 한 후 코드입니다 (나는 GDB에 입력 한 내용 정확히 경기에 캐스트를 추가,하지만 그들없이 동일한 결과를했다) :코드를 실행하면 가비지가 반환됩니다. 디버거에서 입력이 여기에 올바른 결과

NSUInteger addedRefOrder = (NSUInteger)[(NSArray*)[sourceMap tileRefsAtX:[addedRef x] y:[addedRef y]] indexOfObject:addedRef]; 

을 여기가 GDB에 입력 한 내용은 다음과 같습니다 공식적으로

(gdb) print (NSUInteger)[(NSArray*)[sourceMap tileRefsAtX:[addedRef x] y:[addedRef y]] indexOfObject:addedRef] 
$2 = 1 
(gdb) print addedRefOrder 
$3 = 9223372036854775807 

, 나는 후자의 값이 NSNotFound 것을 매우 확신합니다. 이 문제가 의미하는 바는 무엇입니까? 어떻게 디버깅을 시작합니까?

편집 : 개체가 배열에 포함되어 있습니다. NSNotFound IS가 반환되었지만 올바르지 않습니다. 그 선 후

NSPoint irisPoint = NSMakePoint([currentObject x], [currentObject y]); 

브레이크 포인트를 잘 :

(gdb) print irisPoint 
$1 = { 
    x = 4301764096, 
    y = 4301764096 
} 
(gdb) print [currentObject x] 
$2 = 4 
(gdb) print NSMakePoint([currentObject x], [currentObject y]) 
Program received signal EXC_BAD_ACCESS, Could not access memory. 
Reason: KERN_INVALID_ADDRESS at address: 0x0000000000000018 
0x00007fff885e010a in objc_msgSend() 

답변

0

이 문제가 xy 유형 NSInteger의했다이었다 밝혀, 그리고 컴파일러는 다른 CGFloatxy 방법에서 직선을 유지하는 데 문제가 있었다.

결국 해결책은 currentObject을 올바른 유형으로 캐스팅하는 것이 었습니다.

2

당신이 addedRefOrder를 사용하기 전에 필요 다음과 같은 검사를 수행하지 않는 것 같다 여기에 다른 곳에서 같은 응용 프로그램의 다른 상황이다. 이 NSNotFound 경우

if (addedRefOrder == NSNotFound) { 
    NSLog(@"Object %@ not found in array %@", addedRef, array); 
} 

은, 그것은 쓰레기 값이 아니다 나는이 결과에 의문을 제기하고 코드의 다른 곳에서 찾기 전에 디버거를 중단하지 않을 것입니다. 왜 그것이 옳지 않다고 생각하니? 보통 이런 일은 우리 자신의 잘못입니다. 이 코드 스 니펫의 범위를 벗어난 로직에 대한 몇 가지 문제점을 간과 한 것일 수 있습니다.

위 내용이 사실이라면 코드를 검토하여 코드가 배열에없는 이유를 파악하십시오.

확인할 사항 중 하나는 isEqual : addedRef 객체의 클래스를 구현하는 것입니다. 왜냐하면 배열이 객체가 배열에 있는지를 결정하기 때문입니다.

또한 디버거의 첫 번째 줄 결과를 신뢰할 수 없습니다. 방금 모든 메소드를 두 번째 호출했으며 반환 값에 영향을 줄 수있는 호출이있을 수 있습니다. 어쩌면 두 번째 호출 할 때 실제로 배열에 일부 부작용이 있습니다.

또한 스레드를 사용하지 않는 경우 쉽게 제외 할 수있는 동시성 문제 일 수 있습니다. 당신이 그렇다면 나는 평소 용의자를 볼 것입니다.

+0

개체가 배열에 있습니다. – andyvn22

관련 문제