2013-01-04 4 views
0

코드는 한 번에 배치 작동하지 않음 :내 응용 프로그램에서 스레드에 다음 코드를 가지고

while (true) { 
    if (ready) { 
     progressIndicatorController.value++; 
     return; 
    } 
} 

레디 변수가 대리자 메서드에서 변경됩니다. 이 코드는 Xcode 도구 모음에서 "실행"버튼을 클릭하여 응용 프로그램을 열면 효과적입니다. 그러나이 애플리케이션의 .app (제품> 보관 ​​파일을 클릭 한 다음 단계를 수행하여 생성 한)을 열면이 코드가 어떻게 든 더 이상 작동하지 않습니다.

progressIndicatorController.value은 결코 증가하지 않으며이 if 문은 true으로 평가되지 않습니다. 이 문제의 원인은 무엇입니까?

답변

1

이것은 아마도 컴파일러의 최적화로 인해 발생합니다.

Archive로 빌드 할 때 컴파일러에서 Xcode를 사용하면 이러한 종류의 코드를 버릴 수 있습니다. 나는 준비된 변수를 휘발성으로 설정하는 것이 문제를 해결할 수 있다고 생각한다. 만약 내가 당신이라면이 문제를 일으키지 않도록 다시 작성하려고 노력할 것이다.

구성표 드롭 다운에서 구성표 편집을 선택하여 최적화 기능을 테스트 할 수 있습니다. 그런 다음 Run MyApp.app에서 Build Configuration을 Release로 설정하십시오. 디버깅이 끝나면 디버거를 다시 설정하는 것을 잊지 마십시오. 최적화가 실행될 때 디버거가 다소 혼란스러워집니다 (즉, 대부분의 변수 값을 볼 수 없거나 일부 중단 점이 비정상적으로 작동하는 등).)

+0

실제로 '준비'를 '휘발성'으로 설정하면 문제가 해결됩니다. 이 코드를 어떻게 다시 작성해야합니까? 나는 정직하게 대안을 생각해 낼 수 없다. 내가해야 할 일에 대해 조언 해 줬어? 답변 주셔서 대단히 감사합니다! – Frog

+0

코드에 대해 더 많이 알지 못해도 어렵지만 일반적으로 NSThread는'performSelector : onThread : withObject : waitUntilDone :'과 함께 다른 스레드로부터 메시지를 보낼 수 있습니다. 예를 보려면 http://stackoverflow.com/questions/2584394/iphone-how-to-use- 개체 선택을 통해 개체를 만들거나 방법을 선택하십시오. 또한 때로는 두 개의 dispatch_async를 사용하는 것만 큼 쉽습니다. 하나는 스레드 블록 용이고 다른 하나는 완료 될 때 사용하는 것입니다. – Taum

+0

포인터를 가져 주셔서 감사합니다. 나는 그것을 살펴볼 것이다. – Frog

관련 문제