关于category

类别,用于增加类的方法。只能用于单个类,只能增加方法不能增加属性。这是与protocol的区别。协议能多个类共用。(协议是多个类共享的一个方法列表)可以使用conformsToProtocol:方法检查一个类是否遵循某个协议

1 id currentObject;
2 ...
3 if ([currentObject conformsToProtocol:@protocol (Drawing)] == YES)
4 {
5     //Send currentObject paint,erase and/or outline msgs
6     ...          
7 }

非正式协议也称为抽象协议。实际上是一个分类,列出了一组方法而没有去实现它。每个人都继承相同的根对象,因此非正式分类通常是为根类定义的。

@optional指令用于取代非正式协议的使用

在类别中的方法不必全部实现。而且类别中的方法优先级别比较高,如果与类中的方法重名,则覆盖类中方法。

Objective-c不提供真正的多继承,但它提供一种解决方案,允许对象响应再其他类中实现的消息。

如果要让对象响应另一个类的消息,可以给应用程序增加消息转发功能,以便能够访问该对象的方法。

通常,发送无法识别的消息将产生一个运行时错误,从而导致应用程序崩溃。但在崩溃出现之前,iPhone的运行时对象为每个对象提供了第二次机会来处理消息。捕捉到一条消息后可以把它重定向给能够理解并影响该消息的对象。

Objective-c通过一个叫消息转发的过程来提供此功能。发送消息给一个无法处理该选择器的对象时,这个选择器将被转发给一个forwardInvocation:方法。接收这条消息的对象,即一个NSInvocation实例保存原始选择器和被请求的参数。可以覆盖forwardInvocation:方法,并把该消息发送给另一个对象。

原文地址:https://www.cnblogs.com/sevenology/p/3120925.html