Objective-C 13 协议protocol
objective-c,协议,protocol,基础2016-08-15
Objective-C中的协议@protocol,与java中的接口interface类似,其中列出的方法,本类不需要实现,而由实现此协议的类来实现这些方法。
格式:
@protocol 协议名
....方法
@end
两种方法:
@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
生成来一个MyTestProtocol.h文件。
#import <Foundation/Foundation.h> @protocol MyTestProtocol <NSObject> @required -(void)myTest; @optional -(void)log; -(void)print:(int)value; @end@required代表实现此协议的类必须实现的方法,默认(如果不加默认为@required)。
@optional代表实现此协议的类可以实现也可以不实现的方法,不是必须的。
在类的声明后列出协议的名称,用尖括号括起来,多个协议间用逗号隔开。
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:)没有实现则会报出警告。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
协议也可以继承父协议,这与继承父类相似。在声明语句协议名称后面的尖括号内可以指定父协议的名称。
@protocolMyTestProtocol <MyParentTestProtocol>
@end
实现MyTestProtocol的类,也必须实现其父协议中必须要实现的方法。通常可以使用NSObject作为根协议。这个与NSObject类不要混淆,NSObject类符合NSObject协议,这意味着所有的对象都符合NSObject协议。