2009-07-09 12 views
23

내 질문 요약 : NSURLConnection은 해당 대리인을 유지합니까?NSURLConnection은 델리게이트를 유지합니까?

자세한 질문 시나리오 :

나는입니다 JsonDownloader라는 사용자 정의 클래스가하는 URL에 취해 URL을 반환하는 JSON의있는 NSDictionary를 반환해야합니다.

iPhone 앱에서 나는 이와 같은 작업을 수행합니다. 이 경우, 호출하는 객체에 개체 : 그것은 returnDataTo 콜백을 수행하는 상기 JsonDownloader가 다운로드하고 파싱

- (void)viewDidLoad { 
    JsonDownloder *temp = [[[JsonDownloader alloc] initWithURL:urlString returnDataTo:self]]; 
    [temp release]; 
    [super viewDidLoad]; 
} 

가 완료되면 (init 메소드는 전체 프로세스 킥오프).

잘 작동합니다. 웹 서버 응답에 30 초 지연이 있다고하더라도 JsonDownloader는 여전히 존재하며 올바르게 콜백합니다.

제 질문은 이것입니다. JsonDownloader가 이벤트주기가 끝나는 시점을 지키는 방법은 무엇입니까? 나는 그것을 명시 적으로 발표하고있다.

내 직감은 NSURLConnection이 델리게이트에 대해 retain을 수행해야한다는 것입니다.하지만 문서에서 아무것도 보지 못했습니다. 누구나 아이디어가 있습니까?

답변

25

전달되는 변수를 복사하거나 유지하지 않는 설정자가 많지 않으므로 변수의 메모리가 보유 수가 0이 될 때 다른 것에 다시 할당되지 않도록하십시오.

그러나 대답은 '예'입니다. 테스트 코드의 약간을 보여줍니다 대리인의 유지 카운트가 올라가 :

로그에 생산
NSLog(@"Retain count before: %d", [self retainCount]); 
NSURLRequest* request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://google.com"]]; 
NSURLConnection* conn = [NSURLConnection connectionWithRequest:request delegate:self]; 
NSLog(@"Retain count after: %d", [self retainCount]); 

:

Running… 
2009-07-09 02:13:40.516 delegateRetain[45123:a0f] Retain count before: 1 
2009-07-09 02:13:40.525 delegateRetain[45123:a0f] Retain count after: 2 

Debugger stopped. 

그래서 당신은 꽤 명확하게 connectionWithRequest:delegate: "자기"에서 볼 수 실제로 데 그 보유 횟수가 +1 증가했습니다. 당신은 용감 느낌이있어와 EXC_BAD_ACCESS 신들과 혼란을 원하는 경우, 포스트의 dealloc의 감소를 보여, 다시 "1"을 출력 할

[conn dealloc]; 
NSLog(@"Retain count after dealloc: %d", [self retainCount]); 

에 추가 할 수 있습니다.

+1

중대한 질문 및 중대한 응답. 나는 이것으로 어려움을 겪고 있었지만, 대의원이 배정 된 직후에 [self release]를 추가하기로 결정했다. 자기가 내 수업 시간에 위임자이기 때문에, 그 보유 수를 늘릴 이유가 없음을 알았습니다. 그것이 틀렸다면 누군가가 내게 알려줍니다. – jocull

+0

그냥 추가하고 싶습니다 - 고마워요. The Missing Manual, part 327. 애플의 문서에 이처럼 중요한 사실이 언급되어 있지 않다는 신념이있다. 나는 그것을 유지하고 있었지만 확실하지는 않았다고 생각했다. 문서는 그것에 대해 아무 말도하지 않았고, 대부분의 경우 Cocoa 프레임 워크의 대리인은 대부분 보유되지 않았다. 이것은 예외입니다. – n13

9

대부분의 위임 특성이 유지하지만 순환 참조를 방지하기 위해 할당되지 않은) 그러나, NSAutoreleasePool 연결을 해제하려고하기 때문에 당신은 좋은 Program received signal: “EXC_BAD_ACCESS”.를 얻을 수 있습니다 그리고 그것은 사라질 것입니다. 그것에 관한 질문도 this을 참조하십시오.

그러나 NSUrlConnection에는 특정 대리인 속성이 없습니다. 위임을 연결 초기화와 함께 지정해야합니다. 나는 데이브 마토라나 (Dave Martorana)가 보여 주었던 것처럼 그것이 그것이 유보를받는 이유라고 생각한다.

7

예를 들어, "특수 고려 사항"의 Xcode Documentation for -[NSURLConnection initWithRequest:delegate:]에 따르면 "연결이 대리자를 유지하며 연결로드가 완료되면 위임을 취소하거나 취소합니다"라고 설명합니다. 또한보십시오 : NSURLConnection inherent memory leak?

+1

그래, NSURLConnection에서 "참고"입니다. 그것은 오히려 중요하기 때문에 여전히 메소드 설명에 언급되어야합니다. – n13

관련 문제