Objective-C中的协议@protocol,与java中的接口interface类似,其中列出的方法,本类不需要实现,而由实现此协议的类来实现这些方法。
1 声明协议protocol
格式:
@protocol 协议名
....方法
@end
两种方法:
1直接在某个类中声明。例如:协议NSObject是在NSObject.h文件中声明。
@protocol NSObject - (BOOL)isEqual:(id)object; @property (readonly) NSUInteger hash; @property (readonly) Class superclass; - (Class)class OBJC_SWIFT_UNAVAILABLE("use 'anObject.dynamicType' instead"); - (instancetype)self; - (id)performSelector:(SEL)aSelector; - (id)performSelector:(SEL)aSelector withObject:(id)object; - (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2; - (BOOL)isProxy; - (BOOL)isKindOfClass:(Class)aClass; - (BOOL)isMemberOfClass:(Class)aClass; - (BOOL)conformsToProtocol:(Protocol *)aProtocol; - (BOOL)respondsToSelector:(SEL)aSelector; - (instancetype)retain OBJC_ARC_UNAVAILABLE; - (oneway void)release OBJC_ARC_UNAVAILABLE; - (instancetype)autorelease OBJC_ARC_UNAVAILABLE; - (NSUInteger)retainCount OBJC_ARC_UNAVAILABLE; - (struct _NSZone *)zone OBJC_ARC_UNAVAILABLE; @property (readonly, copy) NSString *description; @optional @property (readonly, copy) NSString *debugDescription; @end
2 单独创建一个类声明
生成来一个MyTestProtocol.h文件。
#import <Foundation/Foundation.h> @protocol MyTestProtocol <NSObject> @required -(void)myTest; @optional -(void)log; -(void)print:(int)value; @end
@required代表实现此协议的类必须实现的方法,默认(如果不加默认为@required)。
@optional代表实现此协议的类可以实现也可以不实现的方法,不是必须的。
2 实现协议
在类的声明后列出协议的名称,用尖括号括起来,多个协议间用逗号隔开。
People.h
#import <Foundation/Foundation.h> #import "MyTestProtocol.h" @interface People : NSObject<MyTestProtocol,NSCopying> @end
People.m
#import "People.h" @implementation People //必须要实现的方法 -(void)myTest{ NSLog(@"mytest.."); } -(id)copyWithZone:(NSZone *)zone{ //... return [[People alloc] init]; } //选择实现的方法 -(void)log{ NSLog(@"log 可选择实现的方法"); } @end
如果必须实现的方法(myTest、copyWithZone:)没有实现则会报出警告。
3 测试
People *pe = [[People alloc] init]; [pe myTest]; [pe log]; //是否实现MyTestProtocol协议。 BOOL b = [pe conformsToProtocol:@protocol(MyTestProtocol)]; NSLog(@"b=%d",b);
输出:
2016-08-15 11:04:36.282 命令行工程[1177:49836] mytest.. 2016-08-15 11:04:36.282 命令行工程[1177:49836] log 可选择实现的方法 2016-08-15 11:04:36.282 命令行工程[1177:49836] b=1
4 父协议
协议也可以继承父协议,这与继承父类相似。在声明语句协议名称后面的尖括号内可以指定父协议的名称。
@protocol MyTestProtocol <MyParentTestProtocol>
@end
实现MyTestProtocol的类,也必须实现其父协议中必须要实现的方法。通常可以使用NSObject作为根协议。这个与NSObject类不要混淆,NSObject类符合NSObject协议,这意味着所有的对象都符合NSObject协议。
时间: 2024-12-29 09:39:05