問題は一般化の1つです。無制限のインポートは避けるのが最善です。
このシナリオを想像してみてください。(KDTimerと呼ばれるクラスからの)タイマーが実行され、ある時点で期限切れになります。次に、3つのゲームモードA、B、C(すべて3つの異なるクラスに対応)で使用します。これで、ゲームモードが異なれば、タイマーの有効期限に対する反応も異なります。あなたが得る違いは次のとおりです:
委任:
KDTimerでプロトコルを定義し、a、b、またはcをそのデリゲートに設定し(実際には、a、b、またはcはそれ自体をタイマーデリゲートに設定します)、
-(void) increaseProgress {
//incrementProgress
if(self.progress>=1)
[_delegate timeExpired];
}
そして、あなたは金色です。
非デリゲート:
#import "A"
#import "B"
#import "C"
@synthesize a,b,c;
-(void) increaseProgress {
//incrementProgress
if(self.progress>=1)
[self.a timeExpired];
[self.b timeExpired];
[self.c timeExpired];
//we don't really know which instance should be messaged
}
重要なのは、デリゲートを使用しないと複雑なコードになる可能性があるということです。デリゲートを使用すると、より再利用可能なコンポーネントが得られます。タイマーはゲームモードについて知る必要はありません。タイマーが期限切れになったことを通知しようとしているだけです。