2013-08-23 1 views
0
@synchronized(self.runningOperations) {      line 1 
[self.runningOperations addObject:operation];    line 2 
} 

이 코드를 디버깅 할 때 먼저 줄 1을 실행 한 다음 줄 2로 이동합니다.이 후에 줄 1로 다시 이동합니다. 그 다음에 2 행으로 이동 한 다음 @synchronized로 건너 뜁니다. 하지만 runningOperations를 인쇄 할 때 처음으로 행 2 코드를 실행하면 Object가 self.runningOperations에 추가되지 않고 두 번째 코드에 추가됩니다. 두 번 실행되는 이유와 Object가 두 번째로 self.runningOperations에 추가되는 이유는 무엇입니까?@synchronized Objective-C

+0

'self.runningOperations! = nil'? – trojanfoe

+0

처음 작업 개체가 존재하지 않을 수도 있습니다. – SRI

+0

@trojanfoe 1 행과 2 행 사이에 추가합니다. 또한 tiwce를 실행하지만 처음에는 2 행 ([self.runningOperations addObject : operation];)을 실행하지 않았으므로 처음에는 self.runningOperations가 nil하지만 두 번째로 두 번째 코드를 실행하므로 두 번째에는 self.runningOperations가 nil이 아닙니다.이 경우는 무엇입니까? – SubCycle

답변

2

필자는 우연히 @synchronised 코드를 디버깅했습니다.

나는 디버거가 line1, line2의 패턴을 따르는 것을 관찰했다. 나는 이것을 이상한 것으로 생각하지는 않았지만 디버거가 훨씬 이상한 일을하는 것을 보았습니다.

내 추측은 (아마도 낮은 수준의 프로그램이 시작시 잠금 아무것도하지

  • 이지만, 디버거가 여전히 라인
  • 동기화 코드를 입력 통과한다는 것입니다 어떤 시점에서 잠금을 얻는 것이 중요합니다.)
  • 자물쇠 검사
  • 그런 다음 원자 코드 실행을 시작합니다. 복음로 디버거의 출력을하지 않습니다에

내 최고의 조언이 될 것입니다. 당신이 출시 중이라면 디버그 에서조차 거의 틀림 없음을 확신합니다. 이상한 주문에서 단계적으로 강조 표시되는 것을 보았습니다. 왜 그런지 확실히 말할 수는 없지만, 실제로 본 코드와 컴파일 된 코드 간의 불일치가있을 수 있습니다.

+1

+1 동의. 'NSLog' 문을 추가하여 실행이 실제로 두 번 발생하는지 확인하십시오. 아마도 그렇지 않습니다. – zoul

0

self.runningOperation이 항상 nil 인 경우 동기화에 사용할 수 없습니다. 초기화가되어 있는지 확인한 후 @synchronized()을 호출하십시오.