首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >代表的优势

代表的优势
EN

Stack Overflow用户
提问于 2013-12-25 17:21:44
回答 3查看 91关注 0票数 0

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

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

DismissViewDelegate.h

代码语言:javascript
复制
@protocol DismissViewDelegate <NSObject>

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

@end

我的问题是,由于我是自创建委托和协议的新手,这种方法与给VC2一个指向VC1的弱指针有什么不同,比如:

代码语言:javascript
复制
@property (weak, nonatomic) VC1 *firstVC;

这样我就可以说:

代码语言:javascript
复制
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

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

然后,在修改对象之后,我将从VC2传递类似于firstVC.object = self.object的对象,然后关闭VC2。

这两种方法与结果不同吗?或者第二种解决方案根本不起作用?委托方式的好处是什么?非常感谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-12-25 17:26:54

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

票数 2
EN

Stack Overflow用户

发布于 2013-12-25 17:26:45

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

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

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

票数 2
EN

Stack Overflow用户

发布于 2013-12-25 17:30:17

在示例中,当您使用:

代码语言:javascript
复制
@property (weak, nonatomic) VC1 *firstVC;

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

让我们想象一下,您创建了VC1,然后在视图等级中添加了VC2,之后您的应用程序可以在VC2中完成很多事情(也许您添加了另一个VC3来查看层次结构)。弧线可以释放您的VC1,在这个场景中,firstVC在VC2中的属性将是nill,您的应用程序将崩溃。有了委托,你就安全了。对于您的示例,可以考虑使用块而不是委托。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20775169

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档