【Objective-C】类别(拓展类)、协议
来源:互联网 发布:ubuntu添加环境变量 编辑:程序博客网 时间:2024/05/16 10:31
一、类别(Category)简介
OC中类别功能强大,它能够在不使用继承的情况下向现有的类添加新的方法。特别是在没有类的源代码的情况下,通过使用类别依然能够向该类添加新的方法。
类别的主要有两个作用,一是向类添加新的方法以拓展类的功能,二时将类的实现部分分布发哦多个文件中。
二、声明类别并实现类别方法
1. 类别的声明与实现的格式如下
#import "目标类名.h"@interface 目标类名 (类别名称)// 方法声明区@end@implementation 目标类名 (类别名称)// 方法实现区@end
其实类别的声明与实现格式与类的声明和实现格式类似。区别就是类别声明后面会加上小括号,而类接口声明没有小括号。方法声明区中给出了类别中的方法声明,这些方法会附加到目标类中。注意:在附加之后这些方法与类的其它方法没有任何区别,他们也能够访问类的成员变量,或是继承到目标类的子类中。但是,如果目标类和类别都定义了一个签名完全一样的方法,则类别中的方法会替换类中定义的方法。如果有两个类别都定义了一个签名完全一样的方法,则调用哪一个方法是不用确定的。另外类中只能定义方法,不能定义成员变量。
2. 拓展类的功能:
有时候根据需要,比如说一个项目有不同的模块,要分配给不同的人做。这时候就可以使用类别,我们可以定义多个附加到目标类的类别,并在该类别中实现需要实现的方法。
新建文件---oc file---类名、file type、附加的类名称
#import "Student.h" //导入这个文件是位了要知道目标类中有哪些方法//#import <Foundation/Foundation.h> //不需要导入这个文件了// ()代表着一个分类// ()中的Test代表着分类的名称// 不使用@class是因为“分类”是给原类拓展一些方法@interface Student (Test)- (void)test2;@end
#import "Student+Test.h"@implementation Student (Test)- (void)test2 { NSLog(@"这个代表调用的test2"); }@end
3. 拆分类的实现:
除了拓展类的行为之外,类别还有一个作用就是将类的实现分成若干部分。
三、协议(代理)--- 只有声明.h没有实现.m,需要其他的类去实现
oc中的协议与java、c#中的借口以及c++中的抽象类相类似,用于定义公共接口,并承诺类需要实现协议中规定的方法。使用协议中最大的好处就是它能够有效拓展程序的功能。比如说:,通用串行总线(Universal Serial Bus, USB)就是一个协议,它能够让计算机周边设备连接标准化。现在的计算机都配备了USB接口,这样能够有效拓展计算机的功能。USB协议定义了接口的尺寸、电压、电流大小等规范,只要设备符合USB协议就可以介入到计算机中使用。至于设备的具体作用可以由厂家自己进行设计规划。
java、c#接口、c++抽象类要求实现它的非抽象类必须实现它规定的方法。objective-c中的协议更加灵活,他可以规定哪些方法必须实现,那些方法可以有选择性的地实现。
1. 简介:
1. Protocol:就是一个用途,用来声明一大堆方法(不能声明成员变量),不能写实现;
2. 只要某个类遵循了这个协议,就拥有了这个协议中的所用方法;
3. 只要父类遵守某个协议,那么子类也遵循;
4. Protocol声明的方法可以让任何类去实现,protocol就是协议;
5. OC不能继承多个类(单继承)(:),但是能够遵守多个协议。(<>)
6. 基协议:<NSObject>是基协议,是最根本的协议,其中声明了很多基本的方法;
7. 协议可以遵守协议,一个协议遵守了另一个协议,就可以拥有另一份协议中的方法声明;
2. 声明协议
关键字Protocal,和类的外部接口声明类似,协议定义在@protocol与@end指令之间。@protocol后接协议名称。并使用@required与@optional规定哪些方法必须由采用该协议的类实现,哪些方法可以有选择性地实现,默认为@required(必须要实现)。
格式:
@protocol 协议名 <父协议>
定义方法
@end
注:定义协议的关键字是@protocol,同时协议也是可以继承父协议的。
创建一个协议:
#import <Foundation/Foundation.h>// MyProtocol就是协议,这个协议遵守基协议<NSObject>@protocol MyProtocol <NSObject>// 在协议中可以声明很多有用的方法// @property int age; 在协议中不能声明成员变量,只能是声明方法,也不能实现方法@required// @required关键字主要用于程序员之间的交流,要求实现- (void)pint;- (void)haha;@end@interface MyProtocol : NSObject@end
遵守协议:
#import <Foundation/Foundation.h>#import "MyProtocol.h"// 在类的声明中加入协议的头文件// Person类的声明,这个类继承了NSObject类,遵守MyProtocol协议@interface Person : NSObject <MyProtocol>@end或者按照下面的实现:
#import <Foundation/Foundation.h>// #import "MyProtocol.h"// 在类的声明中加入协议的头文件// 方式二使用一种方式,与前面将的@class前向声明功能一样;在.m文件中在进行导入也是可以@protocol MyProtocol;// Person类的声明,这个类继承了NSObject类,遵守MyProtocol协议@interface Person : NSObject <MyProtocol>@end完成协议中声明的方法的实现:
#import "Person.h"@implementation Person// 在这里进行遵守的协议里所声明的方法的实现- (void)pint { NSLog(@"nihao!");}- (void)haha { NSLog(@"nibuhao!"); }@end测试程序:
#import <Foundation/Foundation.h>#import "Person.h"#import "MyProtocol.h"int main(int argc, const char *argv[]){ @autoreleasepool { Person *per = [[[Person alloc] init] autorelease]; [per pint]; [per haha]; }}3. 注意点
1.协议的定义
@protocol 协议名称 <NSObject>
//方法声明列表
@end;
2.如何遵守协议
(1)类遵守协议
@protocol 类名 :父类名 <协议名称1,协议名称2>
@end
(2)协议遵守协议
@protocol 协议名称 <其他协议名称>
@end;
3.协议方法声明中的关键字
(1)required (默认)要求实现,若没有实现则警告但不报错
(2)Optional 不要求实现
4.定义变量时遵守协议的限制(只能是对象)
类名<协议名称> *变量名 NSObject<.Myprotocol> *obj;
Id <协议名称> 变量名 id <.Myprotocol> obj1;
5.Property中声明的属性也可以做遵守协议的限制
@property (nonatomic ,strong ) 类名<协议名称> *属性名;
@property (nonatomic ,strong ) id<协议名称> 属性名;
6.补充:协议本身写在头文件中,但也可以定义在任何地方。当这个协议只有这个类使用遵守时,一般把协议写在这个类里面(同一文件),当这个协议需要多个类去实现时,就写在外边单独的文件中(新建)。
4. 实现协议
协议定义后,需要其他类遵循(实现)协议。在类的外部接口中,可以定义其他类遵从哪些协议。类不允许继承多个类,但是类允许遵从多个协议。当某个类需要遵从多个协议时,可以在类的接口中的@interface指令后给出,协议名称必须位于尖括号内,多个协议名称之间使用逗号分开。
5. 使用协议限制对象类型与行为
协议可以限定对象类型,并在程序的编译期间给出警告。
6. 在程序中我们跟难知道程序是否实现了协议这一功能。这时候需要我们对协议进行判断。
// conformToProtocol: 判断是否遵守了某协议 if ([stu conformsToProtocol:@protocol(Read)]) { NSLog(@"对象遵守了协议"); } // 判断是否遵守了某内容 if (![stu respondsToSelector:@selector(haha)]) { NSLog(@"对象没有实现这个方法"); }
**:协议的相关案例后面的博文中会继续分享。= =
1 0
- 【Objective-C】类别(拓展类)、协议
- 【Objective-C】类别(拓展类)、协议
- Objective-C类别和协议
- Objective-C中的类别和非正式协议
- Objective-C语言:协议、类别与扩展
- Objective-C中的类别和非正式协议
- objective-c中的协议和类别
- objective-c中对类方法的扩展:类别,以及非正式协议(十)
- ios学习笔记(二)之Objective-C类、继承、类别和协议 - superlucky
- Objective-C category (类别) 和 protocol (协议)
- Objective-c类别
- Category 类别 -Objective-C
- Category 类别 -Objective-C
- Objective-c类别
- Category 类别 -Objective-C
- Objective-C语言--类别
- Category 类别 -Objective-C
- Category 类别 -Objective-C
- 深入理解 CocoaPods
- 实用代码块记录9
- Android中常用的四种点击事件
- Codefroces 675 B. Restoring Painting
- 阿里云易立:Docker落地应采用演化方式,而非革命手段
- 【Objective-C】类别(拓展类)、协议
- I2C总线协议
- 知乎上说的关于HMM 隐马尔科夫链的
- SpringMVC框架原理图
- 嵌入式入门知识
- 实用代码块记录10
- CCF 201604-4 游戏
- 58. Length of Last Word
- 资治通鉴导读笔记