iphone - 委托(delegate)和通知有什么区别?

标签 iphone objective-c cocoa cocoa-touch xcode

委托(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)一样做几乎正确的工作。那么,什么时候应该使用 delgateNSnotification

最佳答案

简短回答:您可以将代表想象成电话。你调用你的伙伴,特别想和他们谈谈。你可以说些什么,他们可以回应。你可以一直聊到挂断电话为止。委托(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/

相关文章:

objective-c - Mac 创建简单的 dylib?

iOS 8 : How to implement a rotating view controller on top of a portrait-only app?

ios - 使用 Swift 的 UICollectionView

objective-c - 从 UITextView 获取换行符

mysql - 是否可以使用核心数据模式创建 SQL 数据库

cocoa - 使用绑定(bind)填充 NSOutlineView - KVO 添加项目

iphone - 核心数据根据关系的实体计数得到结果

iphone - 以编程方式打开 iphone 日历应用程序

ios - 推送到 TableView Controller 后看不到 View Controller 内容

cocoa - NSTextField 内阴影