2017-03-09 5 views
1

UIViewController 하위 클래스 (MyViewController)가 있습니다.self.delegate = self를 설정하는 것이 좋지 않은 디자인입니까

MyViewController.h

@protocol TargetChangedDelegate 
    -(void) targetChanged; 
@end 

@interface MyViewController 

@property (weak) id<TargetChangedDelegate> targetChangedDelegate; 

-(void) doSomethingOnYourOwn; 

@end 

특정 조건에 MyViewController의 인스턴스가 위임 또는 그 자체를 설정하기로 결정할 수있다 인스턴스화하는 클래스를 기반 MyViewController.m

@implementation MyViewController <TargetChangedDelegate> 

-(void) doSomethingOnYourOwn 
{ 
    // DO some stuff here 

    // IS THIS BAD ?? 
    self.targetChangedDelegate = self; 
} 

-(IBAction) targetSelectionChanged 
{ 
    [self.targetChangedDelegate targetChanged]; 
} 

-(void) targetChanged 
{ 
    // Do some stuff here 
} 

@end 

. 위의 코드를 참조

Foo.m

@property(strong) MyViewController *myVC; 

-(void) configureViews 
{ 
    self.myVC = [[MyViewController alloc] init]; 
    [self.view addSubview:self.myVC]; 

    if (someCondition) 
    { 
    self.myVC.targetChangedDelegate = self; 
    } 
    else 
    { 
    [self.myVC doSomethingOnYourOwn] 
    //MyViewController sets itself as the targetChangedDelegate 
    } 

} 

, 나는 다음과 같은 질문을했다 : 그것은 말할 MVC/위임 디자인 패턴의 위반 (또는 나쁜 디자인)인가 :

self.delegate = self; 
+0

일종의 배우 모델 표현이 아닌가요? – ntohl

+3

그것의 나쁘지 않은, 그것의 잘못. 위임자가없는 메서드를 쉽게 호출 할 수있는 경우 동일한 클래스의 대리자를 정의 할 때 대리자를 자체로 설정해야하는 이유는 무엇입니까? 다른 클래스를 다루는 영역은 같지만 같은 클래스에서는 의미가 없습니다. – iphonic

+0

이 작업을 통해 달성하고자하는 것이 무엇인지 확실하지 않으면'[myVC doSth] '로 함수를 쉽게 호출 할 수 있습니다 – Tj3n

답변

6

절대적으로 self에 대리자를 설정 아무 문제가 없습니다. 사실 대리자가 다른 사람에 의해 설정되지 않은 경우 기본 대리자 기능을 제공하는 좋은 방법입니다.

분명히 delegate 속성을 선언해야합니다. weak 그렇지 않으면 참조주기가 발생합니다. 당신이

절대적으로 모든 단일 대표 전화를 둘러싸 필요가 없기 때문에 당신이 객체가 자신 위임 할 수 있도록 허용 할 경우

, 조금을 확장하기가 위의 오답과 잘못된 의견을 읽은 당신의 코드는 깨끗

if ([self delegate] != nil) 
{ 
    [[self delegate] someMethod]; 
} 
else 
{ 
    [self someMethod]; 
} 
+0

나는 생각에 따라 ... 나를 위해 그것은 주로 문제의 이름을 짓는 '위임자'입니다. 나는 보통 handleSomething 또는 이렇게하려면 didCompleteX. –

+1

@iphonic 클래스가 자체 델리게이트 프로토콜을 따르도록하는 프로토콜의 목적을 무시하는 것은 아닙니다. – JeremyP

0

self.delegate = self를 지정하는 적절한 방법이 아닙니다. 대리자를 사용하는 경우

-(void) doSomethingOnYourOwn 
{ 
    // DO some stuff here 


    self.targetChangedDelegate = nil; 
} 

과 : 당신의 기능에, 당신은이 작업을 수행 할 수 있습니다

if(self.targetChangedDelegate != nil && [self.targetChangedDelegate respondsToSelector:@selector(targetChanged)] 
{ 
    [self.targetChangedDelegate targetChanged]; 
} 
else 
{ 
    [self targetChanged]; 
}