我有一个关于委托概念的一般性问题。我看到了一个代码示例,其中基本上(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。
这两种方法与结果不同吗?或者第二种解决方案根本不起作用?委托方式的好处是什么?非常感谢!
发布于 2013-12-25 17:26:54
您可以始终将一个控制器的弱指针提供给另一个控制器,但是委托的目的要比拥有该弱链接的目的更多。您可以将方法与委托相关联,从而为您提供组织良好的代码。尽管您始终可以给出弱指针,然后使用该弱指针执行方法(尽管这不是一个可接受的实践)
发布于 2013-12-25 17:26:45
当您将VC1的实例传递给VC2时,您正在将VC2耦合到特定的实现。
如果使用委托,区别在于它可以属于任何类,只要它响应协议的方法。
这种松散耦合意味着委托可以是任何类的实例,但在第一个示例中,它必须是VC1或子类的实例。这意味着您的界面更加灵活。
发布于 2013-12-25 17:30:17
在示例中,当您使用:
@property (weak, nonatomic) VC1 *firstVC;如果您的第一个控制器将被解除,它可能会失败。
让我们想象一下,您创建了VC1,然后在视图等级中添加了VC2,之后您的应用程序可以在VC2中完成很多事情(也许您添加了另一个VC3来查看层次结构)。弧线可以释放您的VC1,在这个场景中,firstVC在VC2中的属性将是nill,您的应用程序将崩溃。有了委托,你就安全了。对于您的示例,可以考虑使用块而不是委托。
https://stackoverflow.com/questions/20775169
复制相似问题