委托(delegate)和通知有什么区别?
我理解委托(delegate)和协议(protocol),
@protocol classADelegate
-(void)DelegateMethod;
@end
classB <classADelegate>{
classA *ObjOfclassA=[[classA alloc]init];
ObjOfclassA.delegate=self;
//while push later, here we have taken the pointer of classB(self) to `classA` and stored in delegate variable of classA. So, from `classA` we can call the function in `classB`
push:classA from here.
-(void)DelegateMethod{
nslog(@"i am rithik from India");
}
}
classA{
id <classADelegate> delegate;
-(void)viewdidload{
[self.delegate DelegateMethod];
}
}
我的疑问是
1. 为什么我们不在 classA
中这样使用
classA{
**classB** <classADelegate> delegate;
[self.delegate DelegateMethod];
}
使用“id”的原因是什么,它们有什么区别?
2.我们调用了类B的DelegateMethod函数的方法,该函数来自协议(protocol)定义。
相反,我们可以通过定义 classB 的实例方法来直接调用该方法。因为我们在 classA 的委托(delegate)变量中获得了 classB 的指针。
像这样。
classB{
-(void)DelegateMethod;
}
然后在
中调用它classA{
classB delegate;
-(void)viewdidload{
[self.delegate DelegateMethod];
}
}
因此,从上面我们已经避免了协议(protocol)和 id 变量。
但我知道我们中的许多人都使用委托(delegate)和协议(protocol)。在这里,我了解到使用委托(delegate)和协议(protocol)的任何优势
这里是DelegateMethod函数方法的协议(protocol)实现的用法。
代替实例定义。
@protocol 的那些用法是什么。请任何人指导我正确的方向。
我是 iPhone 开发的新手。现在,我知道如何创建委托(delegate)。但是当我开始研究 NSNotification
这也是像委托(delegate)一样做几乎正确的工作。那么,什么时候应该使用 delgate
或 NSnotification
。
最佳答案
简短回答:您可以将代表想象成电话。你调用你的伙伴,特别想和他们谈谈。你可以说些什么,他们可以回应。你可以一直聊到挂断电话为止。委托(delegate)以几乎相同的方式在两个对象之间创建链接,您不需要知道委托(delegate)的类型,它只需要实现协议(protocol)即可。另一方面,NSNotifications 就像一个广播电台。他们向任何愿意倾听的人传播他们的信息。广播电台无法收到听众的反馈(除非它有电话或代表)。听众可以忽略该消息,也可以对其进行处理。 NSNotifications 允许您向任何对象发送消息,但您不会在它们之间建立来回通信的链接。如果您需要这种通信,您可能应该实现一个委托(delegate)。否则,NSNotifications 更简单易用,但可能会给您带来麻烦。
长答案:
委托(delegate)通常是一种更合适的处理方式,尤其是当您正在创建供其他人使用的框架时。当您对委托(delegate)使用协议(protocol)时,您可以在编译时检查所需的方法,因此您知道何时编译是否缺少任何所需的方法。使用 NSNotificationCenter,你没有这样的保证。
NSNotificationCenter 是一种“hack-ish”,经常被新手程序员使用,可能导致糟糕的架构。很多时候这两个功能是可以互换的,但是更多“硬核”开发人员可能会 mock NSNotificationCenter 的使用。
问: 使用“id”的原因是什么,它们有什么区别?
答: 使用 id
可以将任何对象作为参数发送到方法。请注意,您不能发送 bool、float、double、int 等原语,除非它们被包装在各自的对象包装器中。
classB{
-(void)DelegateMethod;
}
然后调用它
classA{
classB delegate;
-(void)viewdidload{
[self.delegate DelegateMethod];
}
}
您提供的上述示例要求 classA
的委托(delegate)始终为 classB
类型,这并不有利。在这种情况下,您可能不使用委托(delegate),而是使用一个引用您的其他类的变量,例如 myClassB
。委托(delegate)的美妙之处在于您可以传递任何对象,只要代码实现了所需的方法(只要标记为正确的委托(delegate)类型,编译器就会确保这一点),代码就可以正常工作。
关于iphone - 委托(delegate)和通知有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5325226/