在接触Objective-C不久的同学的眼里,协议protocol的概念也许是一个比较难以理解的东东。经过多次反复的学习,今天终于算是能对这个问题有了一点心得,分想出来供大家参考。本文的主要目的不是讲述协议的理论,而是通过直观的理解和举例说明协议的意义及如何使用。更详细具体的内容还请参考相关书籍。
Objective-C的协议,可以认为是几个类之间可以相互作用的一种手段,这种手段的形式就是这些类所共享的方法的列表。在实际情况下,有些类不可能或者不应该去亲自实现某些特定的方法,这时就需要使用protocol这种设计模式,以其它的类代替其实现这些方法。
我们用“老板”和“秘书”的模型来作例子。
首先打开xcode新建一个command line工程,此时除了main.m这个主函数之外该工程基本上就是空的。在工程中新建一个类Boss,添加一个property:NSString *name并synthesize;再添加一个初始化函数:initWithName:(NSString *)givenName。
现在,一个老板诞生了。但是这个老板只有一个名字,现在是个什么都做不了的光杆儿司令。想要开展业务,必须招聘一个秘书为他做事情。于是,我们新建一个Objective-C类,名叫Secretary。使用与Boss相似的初始化方法。
好了,现在老板有了,秘书也有了,该开始做生意了。制定经营战略等等事务还是免不了要开一些会的,所以老板这个类必须要有一个开会的方法。在boss类中添加一个haveAMeeting方法。可是,不论国内国外,肯定不会有哪个2b老板会亲自去做那些准备会议室、空调、投影仪等等会议准备工作的,这些都应该交给秘书去做。这里就需要使用到协议的概念了。
新建文件,选择Objective-C Protocol,命名为Meeting。建立完成后我们发现,所谓协议,仅仅只有一个头文件。实现协议中的方法,需要在遵循该协议的类中去实现。现在在协议中添加一个方法的声明:-(void)prepareForAMeeting.
下一步呢,就是让Secretary这个类遵循Meeting协议,让秘书有能力去做准备会议这项工作。让秘书这个类遵循协议,须包含头文件后,在声明的时候在声明这一行的末位加上<Meeting>。
然后我们需要对boss类做一定修改,让他可以控制secretary对象。在Boss类中定义并systhesise一个秘书对象,类型为id<Meeting>,并相应地修改初始化函数。
现在可以在secretary类中实现协议中声明的方法prepareForAMeeting了。具体细节不做深究,在该方法中,秘书发送三条nslog消息便表示工作已经完成了。
这样,我们就可以在main.m中建立老板和秘书对象,并让老板在haveAMeeting函数中命令秘书准备开会,看程序的运行结果。如果一切顺利,我们可以在输出栏中看到秘书为我们返回的会议准备结果,这也就意味着协议和委托的方法调用成功了。
objective-c协议为不同的类提供公用的方法
协议定义了一组方法,而不提供具体实现。它定义了其它对象有责任实现的接口。当在自己的类中实现协议的方法时,用户的类就是遵守这个协议的,协议声明的方法可以被任何一个类实现。
通俗易懂地讲
你写了个类,你的这个类提供给我的类使用
我在我的类里初始化了你的类实例,那么好,你的方法我是可以调用的。
但是你的类会在达成某种条件的时候调用一个方法,这个方法你不知道要被谁实现,也无需你实现,你只是探出一个接口。
好吧,我会在按钮按下时调用这个方法,但是要做什么我不管,我也不知道,谁用的谁自己去实现。
那么,在你的类里定义协议
@protocol yourdelegate
-(void)dosomething
@end
定义id delegate属性
并在你按钮按下的方法里
[delegate dosomething];
我的类里使用你的协议
@interface 我的类:NSObject<yourdelegate>
并且在初始化你的类的时候, 你的类.delegate = self;
然后实现你的协议方法
-(void) dosomething
{做你想做的事
}
我的类里使用你的协议
@interface 我的类:NSObject<yourdelegate>
并且在初始化你的类的时候, 你的类.delegate = self;
然后实现你的协议方法
-(void) dosomething
{做你想做的事
}