Objective-C 13 协议protocol

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

Objective-C 13 协议protocol的相关文章

Objective中的协议(Protocol)

作用: 专门用来声明一大堆方法. (不能声明属性,也不能实现方法,只能用来写方法的声明). 只要某个类遵守了这个协议.就相当于拥有这个协议中的所有的方法声明. 协议的声明: @protocol 协议名称 <NSObject> //方法的声明; @end 新建1个协议的方式. NewFile OC-File - protocol 协议的文件名: .h 并且只有1个.h文件. 在协议中,只能用来声明方法,协议的作用:就是专门用来写方法声明的. 类遵守协议: 如果想要让1个类,拥有协议中定义的所有的

Objective-C( protocol协议)

protocol 协议 protocol:用来声明方法 1.协议的定义 @protocol 协议名称 <NSObject> // 方法声明列表.... @end 2.如何遵守协议 1> 类遵守协议 @interface 类名 : 父类名 <协议名称1, 协议名称2> @end 2> 协议遵守协议 @protocol 协议名称 <其他协议名称1, 其他协议名称2> @end 3.协议中方法声明的关键字 1> @required (默认) 要求实现,如果没

协议(Protocol)与委托代理(Delegate)

协议(Protocol)的作用: 1. 规范接口,用来定义一套公用的接口: 2. 约束或筛选对象. 代理(Delegate): 它本身是一种设计模式,委托一个对象<遵守协议>去做某件事情,目的是为了降低对象间的耦合度:或用来逆向传值. 一.定义一套公用接口 1 /** 协议 */ 2 @protocol ExecuteProtocol <NSObject> 3 4 @required 5 /** 6 * @brief 必须实现的某个方法 7 */ 8 - (NSUInteger)q

【OC基础】02-分类(Category)和协议(Protocol)

一.分类(Category) (1).分类的基础知识 分类是在不改变原有类内容的基础上,为类增加一些方法的方式. (2).分类的注意事项 1>分类只能增加方法,不能增加成员变量; 2>在分类方法的实现中可以访问原来类中的成员变量: 3>分类中可以重新实现原来类中的方法,但是这样会导致原来的方法无法在使用 4>在大规模应用中.通常把相应的功能写成分类,对原有的类进行扩充,一般分模块写,一个模块一个分类 二.分类的实现 我们可以再上一节Student类的基础上增加分类: CateStu

IOS阶段学习第19天笔记(协议-Protocol)

IOS学习(OC语言)知识点整理 一.关于协议(Protocol)的介绍 1)概念:协议指多个对象之间协商的一个接口对象,协议提供了一些方法用在协议的实现者和代理者      之间通讯的一种方式 2)声明一个协议@protocol协议的名字<基协议> 一个协议可以遵守另一个协议:      基协议(这个协议就拥有了基协议中所有方法的声明) 3)协议中不能声明成员变量,只能有方法声明. 4)协议中声明方法,默认是required 表明方法是必须要实现的,否则会有系统警告,但不会报错 5)协议中@

协议Protocol

1.协议:是一组声明方法的集合,不能声明成员变量,作用类似于接口. 遵守此协议的类就相当于拥有了这个协议的所有方法的声明,如果父类遵守了某个协议,子类也遵守了这个协议. 遵守这个协议的类可以实现协议中的方法. 关键字: @required:声明必须遵守的方法 @optional:声明可选的方法 2.代理:实现协议的某个方法 3.委托:指定要实现协议方法的对象(代理),代理来实现对应的方法 总结: 委托方:1.定义协议:2.引用代理:3.发送消息 代理方:1.遵守协议:2.实现方法:3.设置自己为

协议protocol和代理delegate的使用

这里的协议是独立的,不再类里面,所以每个类的头文件都要引入#import "MarryProtoco.h"头文件.. 首先新建一个协议 Protocol:MarryProtoco 里面写代理人要执行的方法,或者可选方法 #import <Foundation/Foundation.h> @protocol MarryProtoco <NSObject> //代理人中必须要执行的 . //做饭 - (void)cook; //洗衣服 - (void)washClo

类目 (category),扩展(Extension)和协议(protocol) (转)

@类目-分类(category) 1.类目: 类目(也成类别:Category)是一种为现有类添加新方法的方式2.类目的局限性:1)类目无法向已有的类中添加实例变量: 2)如果类目中的方法和已有类中的方法名称冲突时,类目中的方法优先级高,发生这种情况,则已有类的原始方法永无天日,最好的办法是将自己扩展的方法和原始方法区分开来. 3.类目的作用:?       将类的实现分散到多个不同的文件中–      将多个类目的声明放入同一个.h文件中–      将实现放入多个.m方法中?       使

关于ios object-c 类别-分类 category 的静态方法与私有变量,协议 protocol

关于ios object-c 类别-分类 category 的静态方法与私有变量,协议 protocol 2014-02-18 19:57 315人阅读 评论(0) 收藏 举报 1.category,覆盖原类的方法,即使不引用该category头文件,也能覆盖,respondsToSelector:方法也能响应.2.category,不可以有私有变量,但是可以有@property的声明,property的声明只是声明了该类的set,get方法(需要引用该category的头文件),但是categ