【问题标题】:Advantage of delegates [closed]代表的优势[关闭]
【发布时间】:2013-12-25 17:21:44
【问题描述】:

我有一个关于委托概念的一般性问题。我看过一个代码示例,基本上 (VC = ViewController) VC1 打开 VC2 并通过 segue 将一个对象传递给它。 VC2 修改对象并将其传递回 vc1,然后自行关闭。

VC2 有一个@property (assign, nonatomic) id<DismissViewDelegate> delegate; 属性。在 VC1 通过 segue 打开 VC2 之前,它设置了VC2.delegate = self;。 VC1 和 VC2 都实现了以下协议:

DismissViewDelegate.h

@protocol DismissViewDelegate <NSObject>

-(void)dismissWithProdukt:(Produkt*)produkt;

@end

我的问题是,由于我是自创委托和协议的新手,这种方法与为 VC2 提供指向 VC1 的弱指针有何不同,例如:

@property (weak, nonatomic) VC1 *firstVC;

所以我可以说:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

    VC2 *vc2 = *dvc = segue.destinationViewController;
    vc2.firstVC = self;
}

然后,在修改对象后,我会从 VC2 传递对象,如firstVC.object = self.object,然后关闭 VC2。

这两种方法的结果有区别吗?或者第二种解决方案是否有效?委托方法的优势在哪里?非常感谢!

【问题讨论】:

  • @property (weak, nonatomic) VC1 *firstVC; 应该给你一个线索,为什么委托更好更优雅:不同的视图控制器必须相互了解。没有委托,他们只需要相互信任委托协议已实现。

标签: ios objective-c delegates


【解决方案1】:

您始终可以将一个控制器的弱指针指向另一个控制器,但委托的目的不仅仅是拥有该弱链接。您可以将方法与委托相关联,从而为您提供组织良好的代码。尽管您总是可以给出弱指针,然后使用该弱指针执行方法(尽管不是可接受的做法)

【讨论】:

    【解决方案2】:

    当您将 VC1 的实例传递给 VC2 时,您将 VC2 耦合到特定的实现。

    如果使用委托,不同之处在于它可以是任何类,只要它响应协议的方法即可。

    这种松散耦合意味着委托可以是任何类的实例,但在您的第一个示例中,它必须是 VC1 的实例或子类。这意味着您的界面更加灵活。

    【讨论】:

      【解决方案3】:

      在您使用时的示例中:

      @property (weak, nonatomic) VC1 *firstVC;
      

      如果您的第一个控制器将被释放,它可能会失败。

      假设您创建了 VC1,然后使用 vc2.firstVC = self; 在视图层次结构上添加了 VC2,之后您的应用程序可以在 VC2 中做很多事情(也许您将另一个 VC3 添加到视图层次结构中)。 ARC 可以取消分配您的 VC1,在这种情况下,VC2 中的 firstVC 属性将为 nill,您的应用程序将崩溃。 有了委托,您就安全了。 对于您的示例,您可以考虑使用块而不是委托。

      【讨论】:

      • 感谢您的回答!阻塞是什么意思?
      • @LinusAn 看看这个我之前已经解释过了link
      • 我想了一下你的回答。如果 VC1 被解除分配,难道 id 也会失败吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-04
      • 1970-01-01
      • 1970-01-01
      • 2014-02-27
      • 2013-05-15
      • 2016-12-10
      • 1970-01-01
      相关资源
      最近更新 更多