MyClass*mc=[[MyClass alloc]init];
我们知道,如果一个消息被发送到一个对象,如果这个对象不能处理这个消息,那么一个异常会被抛出(并且应用程序会崩溃)。但一个方法声明一个约定,这个约定表明一个对象能够处理这个消息。如果声明一个可以实现也可以不实现的方法,这是否破坏了这个约定?答案是:Objective-C不仅是动态的,而且是内省的。如果知道某个方法是可选方法的话,那么可以询问一个对象(不管它能不能处理)是否可以处理一个消息,这就保证了可选方法的安全性。
在上面的例子中,respondsToSelector:方法就是判断一个方法是否已经实现。
协议的说明:
(1)协议声明了可以被任何类实现的方法。
(2)协议不是类,他是定义了一个其他对象可以实现的接口。
(3)如果在某个类中实现了协议中的某个方法,也就是这个类实现了那个协议。
(4)协议经常用来实现委托对象。一个委托对象是一种用来协同或者代表其他对象的特殊对象。
(5)新特性的说明
Objective-C在NeXT时期曾经试图引入多重继承的概念,但由于协议(protocol)的出现而没有实现。协议的功能类似于C++中对抽象基类的多重继承,协议本身是多个类共享方法的列表,它本身并不实现这些方法,而让其他类来实现。就是说协议类似于一个公共接口,它规定了多个类之间的接口。
委托(代理)就是基于协议实现的。