繁体   English   中英

如何在Objective-C中引用协议?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM