2009-04-18 3 views
9

이 코드는 매우 간단합니다. 맞습니까? init 메서드를 통해 전달 된 대리자를 유지해야하는지 여부는 알 수 없습니다.대표자에 대한 질문

@interface SomeClass : NSObject { 
    SomeClassDelegate *someClassDelegate; 
} 
-(id)initWithDelegate:(SomeClassDelegate *)delegate; 
@end 

@implementation SomeClass 
-(id)initWithDelegate:(SomeClassDelegate *)delegate 
{ 
    [delegate retain]; // should I be doing this? 
    someClassDelegate = delegate; 
} 
-(void)dealloc 
{ 
    [delegate release]; // obviously only do this if I DO need to retain it 
    [super dealloc]; 
} 
@end 

초기 생각은 아니지만,이 코드는 그렇지 않은 것으로 보입니다. 보유 횟수에 의존 할 수는 없지만 대리인을 처리하는 적절한 방법을 알고 싶습니다.

// self's retain count is 1 
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:req delegate:self]; 
// the retain count is now 2, did the init of URLConnection retain self? 
+1

NSURLConnection은 특별한 경우입니다. 델리게이트 메시지 수신을 막을 수있는 유일한 방법은 연결을 취소하는 것이므로 대리자를 유지하는 것이 아니라 연결 기간 동안 유지합니다. 즉, 대개 대리자를 보유하지 않으며 NSURLConnection의 동작은 구현 세부 사항입니다. 당신이 의존하거나 일반적으로 모방해야하는 것이 아닙니다. 또한 _class_ 대리인이있는 경우는 드뭅니다. 일반적으로 대리인 프로토콜을 선언합니다. –

+0

감사합니다. 마이크, 그게 내가보고있는 것을 설명해줍니다. – Jab

답변

11

아니요, 일반적으로 대리인을 보유하지 않아도됩니다. 델리게이트는 이미 객체에 대한 참조를 가지고 있으므로 델리게이트를 유지했다면 본질적으로 순환 참조를 만들 것입니다. 또한 같은 이유로 대리인이 파기되기 전에 개체가 파괴 될 것이라고 가정 할 수 있습니다.

대리인 사용/구현에 대한 자세한 내용은 thesearticles을 확인하십시오.

편집 : 다른 사람들이 지적한 몇 가지 예외가 있습니다.

+0

기사를 보내 주셔서 감사 드리며 귀하는 저의 대표자에 대한 신념을 확인했습니다. 마이크는 내 질문에 대한 코멘트에서 NSURLConnection을 통해 무엇을 볼 수 있는지도 설명했습니다. – Jab

+2

상황에 따라 개체를 먼저 파괴 할 수는 없지만 최소한 대리인을 설정하지 않아도됩니다. (예 : UIAccelerometer) – rpetrich

1

htw에서 말한 것처럼 일반적으로 대리인은 보유하지 않아야합니다. 멀티 스레드 환경에서는 메소드 호출의 지속 기간에 대해서도 필요한 모든 것을 보유해야 할 필요가 있지만 뒤에서 무효화되지 않도록해야합니다. 예를 들어 (실제로는 해당되지 않음) -[NSURLConnection initWithRequest:delegate]이 스레드가 보유한 새 스레드를 만든 다음 (해당 매개 변수가 autorelease 할 가능성이 있음) 매개 변수를 생성합니다. 실제로 NSURLConnection은 연결 기간 동안 대리인을 보유한다는 점에서 특별한 경우입니다.