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>
@endPeople.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=14 父协议
协议也可以继承父协议,这与继承父类相似。在声明语句协议名称后面的尖括号内可以指定父协议的名称。
@protocol MyTestProtocol <MyParentTestProtocol>
@end
实现MyTestProtocol的类,也必须实现其父协议中必须要实现的方法。通常可以使用NSObject作为根协议。这个与NSObject类不要混淆,NSObject类符合NSObject协议,这意味着所有的对象都符合NSObject协议。
本文介绍了Objective-C中的协议(protocol)概念,它类似于Java的接口。内容包括如何声明协议,如直接在类中声明或单独创建文件声明,以及@optional关键字的使用。接着讲解了如何在类中实现协议,并在测试部分展示了其实例应用。此外,还提到了协议可以继承父协议,以实现更灵活的接口设计。

被折叠的 条评论
为什么被折叠?



