2009-04-09 5 views
0

아래 나열된 NSURLConnection을 사용하고 있습니다. 이 수업에 관해 세 가지 질문이 있습니다. 내가 URL 값을 연결할 때, 디버거는 라인 그 위에 두 번하지만이 줄을 명중 :NSURL 연결 실패 질문

if (theConnection){ 

내가 EXC_BAD_ACCESS를 얻을 두 번째 시간. 첫 번째 URL 할당 (주석 처리 된)을 사용하면 문제가 없습니다.

1.) 차이점은 무엇입니까?

- (void)applicationDidFinishLaunching:(UIApplication *)application { 

//NSString *url = @"http://www.abc.com/afile.mp4"; 

NSString *temp = @"afile.mp4"; 
NSString *url = [@"http://www.abc.com/" stringByAppendingString:temp]; 

theRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url] 
            cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30.0]; 
[url release]; 

NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; 
if (theConnection) { 
    receivedData=[[NSMutableData data] retain]; 
} 

2) 나는 afile.mp 할 파일의 이름을 변경하는 경우, 요청 및 [receivedData 길이] 통과는

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 

을 당한다 1600의 값을가집니다. receivedData에 요청중인 실제 데이터가 있는지 정확하게 확인하는 방법이 있습니까? 대상 파일은 약 7MB이지만 1.5MB에서 9MB까지 다양합니다. 내가 요청한 리소스는 없었지만 아무것도 표시하지 않습니까?

3.) 내 응용 프로그램 대리인에서이 작업을 수행하고 있습니다. 유일한 프로토콜은 UIApplicationDelegate입니다. NSURLConnection 메서드는 대리자가 없으면 어떻게 작동합니까?

답변

4

1). 차이점은 무엇입니까?

- (void)applicationDidFinishLaunching:(UIApplication *)application { 
    //NSString *url = @"http://www.abc.com/afile.mp4"; 
    NSString *temp = @"afile.mp4"; 
    NSString *url = [@"http://www.abc.com/" stringByAppendingString:temp]; 

    theRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url] 
                      cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30.0]; 
    [url release]; 

의 차이는 이들 중 하나가 소유하지 않은 뭔가를 해제와 함께 도망 다른 하나는하지 않습니다 수 있다는 것입니다.

할당하지 않았거나 복사하거나 보관하지 않았으므로 소유하지 않았으므로 놓지 마십시오.

구현 세부 사항에서 문자열 리터럴은 참조 카운팅을 구현하지 않습니다. 문자열 리터럴 개체는 사용자를 유지하거나 해제하려고 할 때 사용자를 무시합니다. 그래서 문자열 리터럴을 릴리스하는 버전이 충돌하지 않고 새 문자열을 만들고 릴리스하는 버전이 충돌합니다. 그러나 이것은 구현 세부 사항입니다. 아무 것에도 의존하지 마십시오. 자신이 소유하지 않은 무언가를 해제하면 충돌이 발생할 것이라고 항상 가정합니다.

receivedData에 요청중인 실제 데이터가 있는지 정확하게 확인하는 방법이 있습니까?

오류 문서와 대조적으로? 응답 코드를 확인하십시오.

다른 데이터와 대조적으로? 해시를 사용할 수는 있지만 올바른 해시를 결정하는 방법은 사용자가 결정할 수 있습니다. 그러나 서버가 잘못된 파일을 제공하지 않는다는 믿음을 갖는 것이 더 쉽습니다.

내가 요청한 리소스는 없었지만 그 사실을 나타내는 것은 무엇입니까?

예. connection:didReceiveResponse:을 구현하고 응답 코드를 확인하십시오.

서버가 mod_speling 또는 이와 유사한 것을 사용하고 있다면 "afile.mp"를 요청한 "afile.mp"를 실제로 변경하는 등의 오류를 반환하는 대신 URL을 수정할 수 있습니다 존재합니다.

3) 내 응용 프로그램 대리인에서이 작업을 수행하고 있습니다. 유일한 프로토콜은 UIApplicationDelegate입니다. NSURLConnection 메서드는 대리자가 없으면 어떻게 작동합니까?

당신이 말한대로 delegate:self, 당신은 연결의 대리인입니다.

Mac에서는 최소한 NSURLConnection이 NSObject에 메서드의 카테고리를 지정하므로 적어도 작동하지 않는 형식에서는 항상 사용할 수 있습니다. 이러한 구현을 오버라이드하므로 NSURLConnection이 연결을 보내면 (사용자가) 해당 메시지를 전달할 때 제공 한 구현으로 이동합니다.

+0

1.) 어떻게 할 수 있습니까? 둘 다 할당하지 마십시오. 2.) 응답 코드를 말할 때, 파일명 또는 MIMEType을 의미합니까? 응답 코드가 표시되지 않습니다. 3.) 차가운 - 문서화 된 곳은 어디입니까? 감사. – 4thSpace

+0

1. 말했듯이 ref-counting 방법은 문자열 리터럴 객체에 대한 no-ops입니다. 그러나 그것에 의지하지 마십시오. 또한 내가 말했듯이, 당신이 할당하지 않았다는 것을 안다 : 그래서 그것을 풀어서는 안된다. 2. 아니오, 응답 코드를 의미했습니다. 내가 말한 위임 메서드를 구현하십시오. 3. NSURLConnection 문서에서. –

+0

응답 개체 (위임 메서드에서)를 받으면 statusCode 메시지를 보내 응답 코드를받습니다. http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSHTTPURLResponse_Class/Reference/Reference.html#//apple_ref/occ/instm/NSHTTPURLResponse/statusCode –