[英]How to reference Protocol in Objective-C?
我知道协议的指令是@protocol,就像@selector一样,但引用协议的“类型”是什么(例如@Selector的SEL)? 在MacOSX堆栈中,它的协议*?
您将其引用为:
id<TheNameOfTheProtocol> aVariableToThatProtocol;
或者,如果消息需要(Protocol *)
对象:
[myObject conformsToProtocol:@protocol(TheNameOfTheProtocol)];
id <YourProtocol> delegate
(用于引用协议)?
我提到了苹果公司的官方DOC ,并找到了一个简单的例子来引用协议中的其他协议:
#import "B.h"
@protocol B; // To break the recursive cycle, you must use the @protocol directive to make a forward reference to the needed protocol instead of importing the interface file where the protocol is defined
@protocol A
- foo:(id <B>)anObject;
@end
协议B的声明方式如下:
#import "A.h"
@protocol B
- bar:(id <A>)anObject;
@end
请注意,以这种方式使用@protocol指令只是通知编译器B是稍后定义的协议。 它不会导入定义协议B的接口文件。
以下是您想要了解的有关protocol
:
在许多方面,协议类似于类定义。 它们都声明了方法,并且在运行时它们都是由Class实例的对象类和协议实例的协议表示的。 与类对象一样,协议对象是从源代码中的定义和声明自动创建的,并由运行时系统使用。 它们未在程序源代码中分配和初始化。
源代码可以使用@protocol()指令引用协议对象 - 声明协议的相同指令,除了它在这里有一组尾随括号。 括号括起协议名称:
Protocol *myXMLSupportProtocol = @protocol(MyXMLSupport);
这是源代码可以召唤协议对象的唯一方法。 与类名称不同,协议名称不指定对象 - 除了@protocol()内部。
而且, protocol
可以通过向对象发送conformsToProtocol:
消息来检查对象是否符合协议:
if ( ! [receiver conformsToProtocol:@protocol(MyXMLSupport)] ) {
// Object does not conform to MyXMLSupport protocol
// If you are expecting receiver to implement methods declared in the
// MyXMLSupport protocol, this is probably an error
}
conformsToProtocol: test类似于respondsToSelector:测试单个方法,除了它测试协议是否已被采用(并且可能是它声明已实现的所有方法),而不仅仅是一个特定方法是否已实现。 因为它检查协议中的所有方法,所以conformsToProtocol:比respontsToSelector更有效: 。
所述conformsToProtocol:测试也是像isKindOfClass:测试,不同之处在于它测试用于基于协议,而不是基于继承层次一个类型的类型。
它与OS X上的相同:
Protocol * p = objc_getProtocol("UITableViewDataSource");
它在<objc/runtime.h>
:
typedef struct objc_object Protocol;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.