2017-03-09 74 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.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 

在一定條件下基於實例化MyViewController的實例可以決定其自身設置爲代表或不是類。

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

它不錯,錯了。爲什麼你可以將委託設置爲self,如果你可以輕鬆地調用沒有委託的方法,就像在同一個類中定義委託一樣。當你與其他班級打交道時,這是正確的,但在同一班級是毫無意義的。 – 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]; 
} 
相關問題