使用委托时创建或不创建协议

时间:2014-05-08 19:09:28

标签: objective-c delegates

我有以下代码:

VCA.h

-(void)updateArrayMethod;

VCA.m

-(void)updateArrayMethod
{
    // Implementation to update array in VCA.
{

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"SegueDetalhes"]) {
        VCB *viewB = ((VCB *)segue.destinationViewController);
        viewB.delegate = self;
    }
}

VCB.h

@property (weak, nonatomic)id delegate;

VCB.m

#import "VCA.h"

实现:

- (IBAction)buttonClick:(id)sender
{
    [self.delegate updateArrayMethod];
    [self.navigationController popViewControllerAnimated:YES];
}

现在,这对我来说很好,我的问题是概念性的。在这种情况下使用协议是否存在实际差异?或者只是保持代码清洁的规则?

例如,我可以在VCB.h中完成同样的事情

@protocol MyProtocol <NSObject>
-(void)updateArrayMethod
@end

@property (nonatomic,assign)id<delegate>delegate;

然后在VCA.m中采用并实现该协议并删除VCA.h中的方法声明。

除了代码组织之外还有区别吗?

1 个答案:

答案 0 :(得分:2)

没有协议你正在做什么是非常脆弱的,它不会扩展。您的VCB必须导入VCA。这意味着您的VCB现已了解VCA。如果以后您希望VCB处理不是VCA的代理,该怎么办?现在,您需要确保VCX实现相同的方法并将其添加到VCX.h文件中。然后,您需要更新VCB以导入VCX.h文件。

这开始变得难看。

定义特定于VCB的协议并将其放在VCB.h文件中要好得多。然后,您的delegate媒体资源应为id<MyProtocol>

现在,您可以创建符合协议的任意数量的类(不仅仅是视图控制器)。其中任何一个都可以设置为委托。 VCB永远不会知道具体的类。 VCB不需要更新。它只知道某些类符合协议并提供所需的方法。

漂亮,整洁,干净。