码迷,mamicode.com
首页 > 其他好文 > 详细

Objective-C 13 协议protocol

时间:2016-08-15 17:26:42      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:

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协议。





Objective-C 13 协议protocol

标签:

原文地址:http://blog.csdn.net/vnanyesheshou/article/details/52208835

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!