设置self.delegate = self是不好的设计

时间:2017-03-09 09:24:40

标签: ios objective-c delegates protocols

我有一个UIViewController子类(比如MyViewController)。

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;

3 个答案:

答案 0 :(得分:6)

将委托设置为self绝对没问题。实际上,如果没有其他人设置委托,这是提供默认委托功能的好方法。

显然,delegate属性必须声明weak,否则你会得到一个参考周期。

为了扩展一点,在阅读了错误的答案和错误的评论之后,如果你允许一个对象成为它自己的委托,那么你的代码就更清晰了,因为你不必用

完全包围每一个委托调用。
if ([self delegate] != nil)
{
    [[self delegate] someMethod];
}
else
{
    [self someMethod];
}

答案 1 :(得分: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];
}

答案 2 :(得分:0)

设置self.delegate = self是不好的设计。它应该是另一个对象。通过协议进行委派是子类化的一种替代设计,您可以在此处阅读有关委派的更多信息:

https://developer.apple.com/library/archive/documentation/General/Conceptual/DevPedia-CocoaCore/Delegation.html

有关协议的更多信息: https://developer.apple.com/library/archive/documentation/General/Conceptual/DevPedia-CocoaCore/Protocol.html