我对委托概念有一个真实的问题。我已经看到一个代码示例,其中基本上(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。
这两种方法与结果有何不同?或者第二种解决方案是否有效?代表方法的优势在哪里?非常感谢!
答案 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,你的应用程序将崩溃。
代表你是安全的。
对于您的示例,您可以考虑使用块而不是委托。