2011-08-12 2 views
2

내 응용 프로그램에서 HTTP 호출을해야하고 웹 서비스의 응답 결과에 관심이 없습니다. 그래서 나는 그것이 연결을 생성하고 그것을 시작하고 autorelease 메모리 누수가 발생하지 않는 것이 좋습니다 있는지 궁금 해서요.NSURLConnection start + autorelease

NSURLConnection* connection = [[NSURLConnection alloc] initWithRequest:request delegate:nil]; 
[connection start]; 
[connection autorelease]; 

가비지 수집이 HTTP 호출을하기 전에 연결 개체를 파괴 할 수 있습니까?

답변

3

이것은 좋은 질문입니다. 명시 적으로 NSURLConnection이 운영 체제에 의해 유지된다고 명시되지 않더라도 연결 요청이 실행 루프의 소스로 추가 된 다음 그대로 유지됩니다. 어떤 경우이든, 문서의이 부분에 설명 된대로

connectionDidFinishLoading:
으로 연결 종료를 관찰하고 연결 개체를 릴리스 한 후 요청의 최소 대리인을 설정하는 것이 더 좋습니다.

마지막으로 if 연결이 요청 다운로드에 성공하면 delegate는 connectionDidFinishLoading : 메시지를 수신합니다. 대리자는 연결 에 대한 메시지를 더 이상받지 않고 NSURLConnection 개체를 해제 할 수 있습니다.

같은 이유로

connection:didFailWithError:
의 오류로 인해 연결이 끊어지지 않도록주의해야합니다.

+0

정상적인 워크 플로에서는 응답을받은 후에 연결이 해제되어야한다는 것을 알고 있습니다. 위임을 통한 테스트는 확실하지 않습니다. 부정적인 결과 만 확정됩니다. 그리고 자동 응답 연결에 대해 몇 가지 긍정적 인 답변을 얻은다고해서 그렇게해도 괜찮은 것은 아닙니다. –

+0

viggio, 훌륭한 답변입니다! – Akshay

+0

Akshay : 감사합니다 Teodor :이 시점에서 대리자 접근은 안전하지 않습니다. 대리자를 사용하지 않으면 예기치 않은 결과가 발생할 수 있습니다. – viggio24

1

서버에서 응답하지 않아도됩니다. 하지만 연결이 이루어 졌는지 확인하고 싶지는 않습니까? 연결 시간이 초과되면 어떻게됩니까? 클라이언트는 오류에 대해 알지도 못합니다. 요청이 서버에 도달했음을 확인한 후에 연결 인스턴스를 해제하는 것이 더 좋습니다.

또한 startImmediately 매개 변수에 대해 initWithRequest:delegate:startImmediately: 메서드를 사용하지 않으므로 start을 호출하지 않아도됩니다.