문제

글쎄, 나는 iPhone SDK 2.2에서 개발중인 앱을 가지고 있었고 최근에는 3.0 시뮬레이터에서 제작하여 시작했습니다. 기본 SDK는 여전히 2.2로 설정되어 있습니다. 나는 그것이 문제를 피할 것이라고 생각했다. 대신 나는 얻는다

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x00000000a1b1c1f3
Crashed Thread:  0

Thread 0 Crashed:
0   libobjc.A.dylib                 0x92f4b688 objc_msgSend + 24
1   Foundation                      0x305085bd -[NSCFString isEqualToString:] + 61
2   HappyApp                        0x00002c27 -[CombinationsTableViewController loadData] + 220 (CombinationsTableViewController.m:64)

충돌은 매우 간단한 라인에서 발생합니다. total a UITextField

if (![total.text isEqualToString:@""] ) {

누구든지 이것을 만난 사람이 있습니까? 스레드 경합 문제라고 생각하거나 전체 앱이 올바르게 컴파일되지 않습니다. 2.2.1 시뮬레이터에서 작동합니다. 이것이 OS 3.0에서 2.2 앱을 테스트하는 방법이 아닌 것으로 판명되면 드롭 다운 상자를 전환하는 것 외에 어떻게해야합니까?

업데이트: Andrew Pouliot는 이것이 공개 된 참조 문제라는 점에서 옳았습니다. 디버거가 한 줄을 가리키고 있었기 때문에 잘못된 힌트를 얻었습니다. 범인은 실제로이 첫 번째 줄이었습니다.

if(!([total.text isEqual:totalTextCache]
  && [divisions.text isEqual:divisionsTextCache])) {
  //Loads the data for the table only if the values were actually changed
  totalTextCache = total.text; //ditto for divisions
}

이 라인은 유일한 용도입니다 totalTextCache, 그리고 그것은 유효하지 않게되었습니다 total.text 변경되었습니다. 이것은 2.2.1 SIM에서 문제를 일으키지 않았을 것입니다. total.text 값이 변경 될 때 런타임에 의해 출시되지 않았습니다. 그러나이 코드는 잘못되었습니다. 나는 Isequal이라고 생각한 일을 정확하게 수행하도록 변경하여 다음을 고쳤습니다.

if(!(total.text==totalTextCache && divisions.text==divisionsTextCache))

실제로 복사하고 싶지 않았기 때문입니다 NSStrings, 그러나 그들이 변경되었는지 확인하십시오 (따라서 참조가 변경되었을 것입니다. 이것은 작동합니다. 이는 불량 코드가 2.2.1 런타임에서 잘 실행되었습니다. 이전 참조는 여전히 해시 속성을 확인하고 비교할 수 있습니다. isEqual.

도움이 되었습니까?

해결책

3.0 SDK를 설치했을 때 2.0 도구가 사라 졌으므로 이것이 적용되는지 확실하지 않지만 시뮬레이터 빌드가 향후 런타임과 호환되도록 설계되지 않았다고 생각합니다.

문제가 코드에있을 가능성이 높습니다. 그렇다면 "스레드 경합"이 아니라 메모리 관리 문제가 있다고 말할 수 있습니다. 모든 것이 Uikit의 기본 스레드에서 발생합니다 (스레드 금고가 아님).

총 변수를 설정하는 위치를 확인하십시오. 이 방법에 도달 할 때 이미 공개되었을 것입니다. RetainCount가 합리적인지 확인하십시오.

3.0을 위해 빌드 할 때 동일한 오류가 있습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top