代表们的优势

时间:2013-12-25 17:21:45

标签: ios objective-c delegates

我对委托概念有一个真实的问题。我已经看到一个代码示例,其中基本上(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。

这两种方法与结果有何不同?或者第二种解决方案是否有效?代表方法的优势在哪里?非常感谢!

3 个答案:

答案 0 :(得分:2)

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

如果使用委托,区别在于它可以是任何类,只要它响应协议的方法。

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

在您使用的示例中:

@property (weak, nonatomic) VC1 *firstVC;

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

让我们假设您创建了VC1,然后在视图层次结构上添加了vc2.firstVC = self;之后的VC2,之后您的应用程序可以在VC2中执行大量操作(也许您可以添加另一个VC3来查看层次结构)。 ARC可以释放你的VC1,在这个版本中,VC2中的firstVC属性将是nill,你的应用程序将崩溃。 代表你是安全的。 对于您的示例,您可以考虑使用块而不是委托。