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

Rau*_*nak 2 delegates protocols objective-c ios

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

MyViewController.h

@protocol TargetChangedDelegate
    -(void) targetChanged; 
@end

@interface MyViewController

@property (weak) id<TargetChangedDelegate> targetChangedDelegate;

-(void) doSomethingOnYourOwn;

@end
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

基于某些条件,实例化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
  } 

}
Run Code Online (Sandbox Code Playgroud)

参考上面的代码片段,我有以下问题:是否违反MVC /委托设计模式(或只是一个糟糕的设计)来说:

self.delegate = self;
Run Code Online (Sandbox Code Playgroud)

Jer*_*myP 6

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

显然,delegate必须声明属性,weak否则您将获得参考周期.

为了扩展一点,阅读上面的错误答案和错误的评论,如果你允许一个对象成为它自己的委托,你的代码就更清晰,因为你不必完全包围每一个委托调用

if ([self delegate] != nil)
{
    [[self delegate] someMethod];
}
else
{
    [self someMethod];
}
Run Code Online (Sandbox Code Playgroud)