我有以下代码:
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中的方法声明。
除了代码组织之外还有区别吗?
答案 0 :(得分:2)
没有协议你正在做什么是非常脆弱的,它不会扩展。您的VCB
必须导入VCA
。这意味着您的VCB
现已了解VCA
。如果以后您希望VCB
处理不是VCA
的代理,该怎么办?现在,您需要确保VCX
实现相同的方法并将其添加到VCX.h
文件中。然后,您需要更新VCB
以导入VCX.h
文件。
这开始变得难看。
定义特定于VCB
的协议并将其放在VCB.h
文件中要好得多。然后,您的delegate
媒体资源应为id<MyProtocol>
。
现在,您可以创建符合协议的任意数量的类(不仅仅是视图控制器)。其中任何一个都可以设置为委托。 VCB
永远不会知道具体的类。 VCB
不需要更新。它只知道某些类符合协议并提供所需的方法。
漂亮,整洁,干净。