Elf*_*red 29
您可以创建协议.它看起来像这样:在MyProtocol.h中:
@protocol MyProtocol
-(void)myMethod;
-(void)myMethod2;
@end
Run Code Online (Sandbox Code Playgroud)
在MyClass.h中
#import "MyProtocol.h"
@interface MyClass : NSObject<MyProtocol>
@end
Run Code Online (Sandbox Code Playgroud)
如果要接收给定协议的对象,可以这样做:
id<MyProtocol> var;
Run Code Online (Sandbox Code Playgroud)
要么
NSObject<MyProtocol> *var;
Run Code Online (Sandbox Code Playgroud)
更多信息在这里
您使用声明"协议"(Objective-C的接口)
@protocol MyProtocol <BaseProtocol1,...,BaseProtocolN>
//methods and properties
@end
Run Code Online (Sandbox Code Playgroud)
where <BaseProtocol>是可选的,表示MyProtocol"继承" BaseProtocol的界面.该NSObject协议在此上下文中很有用,因为它允许您使用
@protocol MyProtocol <NSObject>
//...
@end
Run Code Online (Sandbox Code Playgroud)
指示(在适当的时候)MyProtocol具有标准NSObject方法的符合实例(例如-retain/-release,等).
然后,您声明一个类"符合"协议:
@interface MyClass : NSObject <MyProtocol,...,OtherProtocols>
{}
@end
Run Code Online (Sandbox Code Playgroud)
您可以测试实例是否符合协议:
id myInstance = ...; //some object instance
if([myInstance conformsToProtocol:@protocol(MyProtocol)]) {
// myInstance conforms to MyProtocol
}
Run Code Online (Sandbox Code Playgroud)
您可以通过声明变量保存符合协议的实例来进一步消除编译器警告(请注意,Objective-C的动态性质会阻止编译器验证该合同,并且您仍然可以通过为变量分配不符合的实例来获取运行时错误):
id<MyProtocol> o;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如果您发送的[o retain]不MyProtocol符合NSObject协议,编译器将会抱怨.您可以通过声明MyProtocol符合NSObject上述描述或通过delcaring oas 来使这些警告静音
NSObject<MyProtocol> o;
Run Code Online (Sandbox Code Playgroud)
因为NSObject它不是Cocoa中唯一的根对象(即NSProxy不继承自NSObject),所以符合的所有实例也不一定都MyProtocol符合NSObject.如果您知道他们这样做,您可以声明MyProtocol符合NSObject.
| 归档时间: |
|
| 查看次数: |
18295 次 |
| 最近记录: |