每当我想向父类通知某些内容时,我就使用了委托而不是直接调用父代的函数。我已经实现了这样......
例如:
CustomClass *custom = [[CustomClass alloc] init];
// assign delegate
custom.delegate = self; // Here we are giving parent instance like normal method call.
[custom helloDelegate];
在自定义课程中,我提到了如下的父母......
-(void)helloDelegate
{
// send message the message to the delegate
[_delegate sayHello:self];
}
所以我怀疑,它与直接电话有什么不同?使用self设置委托变量有点等于将父实例提供给子节点,并让子节点在需要时调用该函数,协议如何帮助或为什么我们需要协议?有什么好处?
感谢名单
答案 0 :(得分:2)
你的问题实际上是关于子类化而不是实现协议(或其他语言中的接口,如java)之间的区别。
使用委托,你正在实现一个协议..(这是引用委托和委托本身的类之间的契约)..这给你比子类更多的灵活性,因为通过子类,你自动继承了所有的方法。超类(比使用另一个类的某些方法更具限制性。换句话说:subclassing = 是关系..而实现协议(与委托相同)= 有的关系。
如果您阅读任何有关设计模式的书籍,他们将广泛讨论松散耦合代码和编写阻止修改但允许扩展等代码的优点。基本上使用委托而不是子类化是实现这些设计最佳实践的一种方式。
答案 1 :(得分:1)
使用委托而不是使用直接关系的优势的工作示例。
假设您正在撰写通用应用。您的代码iPadViewController
和iPhoneViewController
中有两个视图控制器,它们都需要从Web服务获取数据。因此,您为Web服务调用webServiceDownloaderClass
创建了一个类。
现在,当webServiceDownloaderClass
完成时,需要通知您的视图控制器。
你的选择......
选项1强耦合
在你iPadViewController
中,你定义了一个方法- (void)webServiceDidGetArray:(NSArray *)array;
。在iPhoneViewController
中,您定义了相同的方法。
为了让webServiceDownloaderClass
调用这些方法,它现在需要对每个控制器的引用......
@property (nonatomic, strong) IPadViewController *iPadController;
@property (nonatomic, strong) IPhoneViewController *iPhoneController;
然后当它完成时需要确定要调用哪一个......
if (iPadController) {
[iPadController webServiceDidGetArray];
}
etc....
这里的缺点是视图控制器有点定义Web服务类在完成时所执行的操作。此外,如果你添加另一个控制器,你有另一个属性,并没有实际保证你引用的控制器实际上有你试图调用的方法。
选项2授权
在我们的服务类中,您可以定义协议。
@protocol WebServiceDownloaderDelegate <NSObject>
- (void)webServiceDidGetArray:(NSArray *)array
@end
和代表......
@property (nonatomic, weak) id <WebServiceDownloaderDelegate> delegate;
现在,您要在Web服务类中定义Web服务类的操作。而且你只需要一个引用任何类想成为委托。此外,任何类都可以是委托。因此,现在iPad和iPhone控制器都可以作为委托,并且通过遵守协议,他们“承诺”Web服务类,他们将实现所需的方法- (void)webServiceDidGetArray:(NSArray *)array;
。
当然,这只是代表可以使用的一种情况。
还有一些情况可能是您应该使用直接关系而不是委托。
答案 2 :(得分:0)
委托调用与不同于普通的方法调用!
不同之处在于如何使用内容,这与调用机制无关。代理用于将提供委托服务的代码的定义与代码&#34;消费&#34;代表服务,以便&#34;消费者&#34; (奇怪的是,这通常是代表委托提供者的服务)不必编码以了解该特定代表提供者。
在Objective C中,委托通常使用&#34; protocols&#34;来实现,但这远不是协议的唯一用途。 Objective C广泛使用它们来提供各种Cocoa类之间的通用接口。
而且,在有限的情况下,可以使用公共超类而不是协议合法地实现委托。
如果您有两个属于同一开发工作的类,并且不可能彼此分开使用,则无需使用委托&#34;模式&#34;促进它们之间的通信,即使它们是服务 - 消费者/服务提供者关系。这样做的唯一原因是&#34;在规范&#34;,如果&#34;服务&#34;在一个不同的项目中被重新使用。