저는 최근에 Apple SDK (iPhone 등)를 배우며 이해할 수없는 것을 발견했습니다. "Using NSURLConnection"에 대한 문서에서NSURLConnection의 Apple SDK 설명서에있는 실수 또는 혼란?
이상한 설명과 예제 코드를 발견했습니다. 먼저, 다음과 같이 말합니다 :
initWithRequest : delegate : 메시지를 받자 마자 즉시 다운로드가 시작됩니다. 델리게이트가 connectionDidFinishLoading : 또는 connection : didFailWithError : 메시지를 수신하기 전에 언제든지 취소 할 수 있습니다.
NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; if (theConnection) { // Create the NSMutableData that will hold // the received data // receivedData is declared as a method instance elsewhere receivedData=[[NSMutableData data] retain]; } else { // inform the user that the download could not be made }
그래서, 다운로드가 즉시 theConnection가 초기화 될 때 다른 스레드에서 즉시 시작해야한다는 것을 나에게 보인다
다음, 그것은 다음의 코드 조각을 보여줍니다. 이것은 코드가 비 블로킹 (nonblocking)하고 위임자 (이 경우에는 self)에게 메시지를 다시 보내기 때문에 명확합니다. 그러나 receivedData의 (자동 출시 스타일) 할당은 다른 스레드가 시작된 이후에 이 발생합니다. 이것은 안전하지 않은 경쟁 조건이 아닌가? 매우 빠른 서버 응답 (예 : 루프백 장치 이상) 또는 재수없는 스레드 예약의 경우 충돌, 메모리 누출 또는 데이터 손실이 발생할 수 있습니까? theConnection이 초기화되기 전에 receivedData를 할당하는 것이 더 바람직하지 않겠습니까? 그렇다면 위의 else case에서 방금 릴리스하십시오.
나는이 코드 조각으로 혼란 스럽다. 누군가 나를 위해 그것을 밝힐 수 있기를 바란다. 어떤 정보를 감사합니다,
루디 Cilibrasi
그건 의미가 있습니다. 제 연구를 위해 모든 위임 메시지가 주 스레드를 통해 전송된다는 주장을 뒷받침하는 URL을 제공 할 수 있습니까? 도움과 정보를 보내 주셔서 감사합니다. –
NSURLConnection의 위임 메시지는 실행 루프를 통해 마샬링되므로 제어권이 반환 된 후에 만 발생할 수 있습니다. – rpetrich
Mark Bessey와 rpetrich에게 도움을 주신 것에 대해 대단히 감사드립니다. 이것은 지금 나에게 분명히 드러났으며 나는 그것을 고맙게 생각합니다. –