`
seemefly1982
  • 浏览: 1237 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
最近访客 更多访客>>
社区版块
存档分类
最新评论

delegate 和 protocol

阅读更多

iOS开发上对delegate使用广泛。
记在这里,如果有新人Google到了,希望能有点帮助。

protocol和delegate完全不是一回事,放在一起说,只是因为我们经常在同一个头文件里看到这两个word。

protocol和java里interface的概念类似,是Objective-C语法的一部分。
定义protocol如下

@protocol ClassADelegate
 
- (void)methodA;
- (void)methodB;
 
@end

那么就是定义了一组函数,这组函数放在一起叫作一个protocol,也就是协议。

函数是需要被实现的,所以如果对于class如下

@interface ClassB <ClassADelegate> {
}
@end

就叫作ClassB conform to protocol ClassADelegate,也就是说ClassB实现了这个协议,
也就是实现了这一组函数。

有了上面这个头文件,我们就可以放心作调用

ClassB *b = [[ClassB alloc] init];
[b methodA];
[b methodB];

而不用担心出现unrecognized selector sent to instance这种错误了。

所以protocol就是一组函数定义,是从类声明中剥离出来的一组定义。

id<ClassADelegate> b = ...;
[b methodA];

这种用法也常见,b是一个id类型,它知道ClassADelegate这组函数的实现。

那么delegate是什么?其实和protocol没有关系。Delegate本身应该称为一种设计模式。
是把一个类自己需要做的一部分事情,让另一个类(也可以就是自己本身)来完成。
比如ClassC

@interface ClassC {
    id delegate;
}
@end

那么ClassC的实现(.m文件)里就可以用delegate这个变量了。
当然这里完全可以用其它名字而不是delegate。

我们也可以这样写

@interface ClassC {
    ClassB *delegate;
}
@end

这样我们知道了delegate是一个ClassB,它就可以提供ClassB里的方法。
可以把一部分ClassC里的工作放在ClassB里去实现。
这样的写法看起来是不是有点奇怪?或者应该写成这样?

@interface ClassC {
    ClassB *classB;
}
@end

…..

delegate没有了…
所以说其实delegate只是一种模式,大家约定俗成,当把自己内部一部分实现暴露给另外一个类去做的时候,就叫实际做事的类为delegate。

为什么会需要把内部实现提出来给另一个类做呢?
最常见的目的就是为了在隐藏实现的前提下,提供一个自定义的机会。
比如Apple提供的iOS SDK里就有众多的delegate,比如最常用的UITableView,
我们没法知道Apple怎么重用UITableViewCell,怎么处理UITableView里Cell的增加、删减,因为我们没有源码。
但是我们可以通过实现Delegate的方法来控制一个UITableView的一些行为。
UITableViewDataSource其实和delegate是一样一样的,只是由于意义不同换了个名字罢了。

protocol在此扮演了什么角色呢?
protocol是一种语法,它提供了一个很方便的、实现delegate模式的机会。
比如写UITableView的时候,Apple这么干
UITableView.m

- (void)doSomething {
    [self blahblah];
 
    [self.delegate guruguru];
 
    [self blahblah];
 }

delegate是我们写的类,这个类如果可以被传给UITableView做为其delegate,那唯一要求,就是它实现了

- (void)guruguru;

这个方法。

如果我们把这个方法定义在一个protocol里

@protocol XXXProtocol
 
- (void)guruguru;
 
@end

就说明了,UITableView需要的delegate是一个conform to XXXProtocol的类。
这就正好是

id<XXXProtocol>

表达的意思。
无论具体的类是什么,它还有其它什么方法,只要它conform to这个protocol,
就说明它可以被传给UITableView,作为它的delegate。
那么Apple为了让我们知道这个protocol是delegate需要conform的protocol,
它就把XXXProtocol改成了UITableViewDelegate

这样我们看到protocol的名字里有Delegate,就知道这个protocol里的函数是用来做自定义(Customization)的了。

代码最终还是给人看的,公司里尤其如此。
大家都希望对方把事情讲得清晰易懂,如果在再有两句俗语或者行话那大家就很开心了 :]

分享到:
评论

相关推荐

    protocol 和 delegate

    总结来说,Protocol和Delegate是Objective-C和Swift中用于对象间通信的重要机制。Protocol定义了对象应遵循的行为规范,而Delegate模式则允许对象之间进行协作和事件传递。这种设计模式广泛应用于UI组件的事件处理、...

    iOS基础开发系列教程

    Delegate和Protocol在iOS编程中扮演着通信和事件处理的角色,第十八讲对此进行了详细阐述。之后的课程介绍了不同的控制器,如UIViewController和UINavigationController,帮助学习者理解导航在iOS应用中的实现。 在...

    ios-侧滑控制器.zip

    5. delegate和protocol:SwiftSlide可能会使用委托模式(delegate pattern)来处理菜单的打开和关闭事件,以及与主视图的交互。这通常通过定义一个协议(protocol)来实现,让其他类可以遵循并处理相关的事件。 6. ...

    ios应用源码之很炫的底部导航 2018127

    9. **Delegate和Protocol**: iOS中的委托模式(Delegate)和协议(Protocol)用于不同对象之间的通信,例如,BottomNavigationBar可能有一个代理,用来通知哪个图标被选中了。 10. **UserDefaults和State ...

    IOS应用源码——WorldTour.rar

    这些视图控制器负责处理用户交互,管理数据展示,并通过Delegate和Protocol机制与其他部分进行通信。 数据存储方面,WorldTour可能会使用Core Data框架。Core Data是Apple提供的一种对象图形管理系统,用于处理应用...

    iOS游戏应用源代码——TomSwift-TSAlertView-37c4c4d.zip

    Swift中的Delegate和Protocol机制在TSAlertView中被广泛使用,以处理用户交互事件。例如,当用户点击警视框上的按钮时,会触发相应的委托方法,执行预定义的回调。 5. **动画效果**: iOS开发中的动画效果能增强...

    ios代理协议的讲解

    ios中非常重要的delegate和protocol的通俗讲解,非常清晰易懂,看了之后,让你对代理和协议有不一样的认识。

    IOS应用源码——SweetDreams.rar

    同时,源码中可能包含Delegate和Protocol(协议),用于不同组件之间的通信。 Model层则包含应用的数据结构和业务逻辑。例如,“SweetDreams”可能有UserModel来存储用户信息,SleepSessionModel来记录睡眠数据。这...

    iOS Swift简单Demo

    此外,为了实现与底部状态栏相关的功能,可能还涉及到了Delegate和Protocol的概念。比如,如果状态栏有按钮或图标,那么可能定义了一个协议来处理点击事件,ViewController会遵循这个协议并实现相关的方法。 在...

    delegate和block的使用

    在iOS和macOS开发中,`delegate`和`block`是两种常见的对象间通信机制,它们各自具有不同的特性和用途。了解并熟练掌握这两种技术对于编写高效、灵活的代码至关重要。 ## delegate(代理) `delegate`是Objective-...

    简单的delegate实现

    在iOS开发中,Delegate是一种非常重要的设计模式,它允许对象之间...通过阅读和分析这些代码,你会对Delegate有更深入的理解。记得实践是检验真理的唯一标准,动手尝试一下,你将在实践中更好地掌握Delegate的运用。

    IOS应用源码——类似mac电脑下面的dock.zip

    7. ** Delegate 和 Protocol**:iOS中实现对象间通信的方式,用于处理事件响应和传递数据。 8. **SwiftUI或Interface Builder**:新的界面构建工具,SwiftUI提供了声明式编程方式,而Interface Builder则是传统的...

    iOS Delegate传值通俗理解

    Delegate是一个协议(Protocol),定义了一组方法,这些方法将在委托对象中实现。协议通常以“Delegate”结尾,例如UITableViewDelegate。当一个对象遵循了这个协议,它就必须实现协议中声明的方法。在我们的示例...

    协议与委托 (Protocol and Delegate) 实例解析demo

    正式协议是通过protocol指定的一系列方法的声明,然后由实现该协议的类自己去实现这些方法。而非正式协议是通过向NSObject中添加一个类别来实现,然后子类去继承NSObject。其实都差不多。 不过,非正式协议已经渐渐...

    iPhone编程delegate示例

    首先,`delegate`是Objective-C中的一个协议(protocol),它定义了一组方法,这些方法可以被其他遵循该协议的对象实现。这种方式允许一个对象(通常称为委托者,或`delegate`)对另一个对象(委托对象,或`...

    iOS学习笔记3---delegate五步曲,轻松学会使用delegate

    本篇文章将通过“delegate五步曲”,帮助你深入理解并熟练掌握如何在iOS应用中使用Delegate,特别是涉及到调用照相机和切换键盘的功能。 第一步:定义协议(Protocol) Delegate的核心是定义一个协议,它定义了委托...

    Delegate&Block作回调

    Delegate是一种协议(Protocol)导向的回调方式,它是Objective-C中的一个关键特性。当一个对象需要另一个对象告知其状态变化或执行某些操作时,可以设置这个对象为自己的代理。代理遵循特定的协议,协议中定义了...

    delegate与block的使用

    Delegate是一种协议(Protocol)的实现,它定义了一组方法,让其他类能够通过遵循该协议来响应某些事件或请求。在Objective-C中,Delegate通常通过指针引用实现,而在Swift中,可以使用弱引用或无主引用避免循环引用...

    swift-多delegate的使用

    标签"Swift开发-其它杂项"表明这是一个关于Swift编程中非常规或特定场景的应用,而"PPSMutableDelegate-master"可能是指一个开源项目,该项目可能提供了更复杂或定制化的Delegate解决方案,例如支持动态添加和删除...

    OC中以delegate形式页面传值

    在这个例子中,我们定义了一个方法`transferValue:fromSender:`,它接受一个字符串值和发送值的视图控制器作为参数。 **三、设置Delegate** 在发送数据的页面(发送者),我们需要一个属性来存储代理,并确保发送...

Global site tag (gtag.js) - Google Analytics