Category(分类)
- Category的概念及使用流程
- Category声明和实现
- Category使用注意
- Category非正式协议
- Category延展
Category的概念及使用流程
- 一、Category概念
-
Category有很多种翻译:分类\类别\类目(一般叫做分类)
Category是OC特有的语法,其他语言没有的语法(类似于C#语言中的”扩展方法”和”partial”关键字) - 二、类别的作用
-
在不修改原有的类的基础上增加新的方法;
一个庞大的类可以分模块开发
一个庞大的类可以由多个人来编写,更有利于团队合作 - 三、使用类别的目的
-
1)对现有类进行扩展:
比如,你可以扩展Cocoa touch框架中的类,你在类别中增加的方法会被子类所继承,而且在运行时跟其他的方法没有区别
2) 作为子类的替代手段
不需要定义和使用一个子类,你可以通过类别直接向已有的类别里增加方法。
3)对类中的方法归类
利用Category把一个庞大的类划分为小块来分别进行开发,从而更好的对类中的方法进行更新和维护。这样条理更加清晰 - 三、使用类别的步骤
- 先声明类别->实现类别->使用类别
类别的命名规则:类名+扩展方法,如”NSString+countNum”。
类别的接口声明与类的定义十分相似,但类别不继承父类,只需要带有一个括号,表面类别的主要用途
Category声明和实现
1.声明一个类
在.h文件中,声明类别:
@interface ClassName(CategoryName)NewMethod; //在类别中添加方法//不允许在类别中添加变量
@end
- 声明类格式:
-
1)新添加的方法必须写在@interface 与 @end 之间
2 ) ClassName 现有类的类别(要为哪个类扩展方法)
3)CategoryName 待声明的类别名称
4)NewMethod 新添加的方法
注意
不允许在声明类别的时候定义变量
不允许在声明类别的时候定义变量
不允许在声明类别的时候定义变量
重要的事情要说三遍
实现类别
在.m文件中(也可以在.h中实现),实现类别:
@implementation ClassName(CategoryName)
NewMethod
@end
- 实现类别格式:
-
1)新添加的方法必须写在@implementation与 @end 之间
2 ) ClassName 现有类的类名
3)CategoryName 待声明的类别名称
4)NewMethod 新添加的方法的实现
也可以通过图形界面生成类别
抵用类别中的方法
与一般成员方法调用形式完全一样
需要包含类别的头文件
Category使用注意
- 1.分类可以访问原来类中的成员变量 2.如果分类和原来类出现同名的方法,优先调用分类中的方法,原来类中的方法会被忽略 3.分类的编译顺序
-
最下面的是最后编译,当多个分类中有同名方法,则执行最后编译的文件方法
Category非正式协议
非正式协议就是给NSObject类创建的类目(分类)又叫做非正式协议,非正式协议一般不需要进行实现,一般在子类中进行方法的重写。
思考&实现:
统计一个字符串中阿拉伯数字的个数
NSString * str = @”asdjasdjsaldk1 1j2k1 2lkas”;
思路:
取出字符串的每一个字符
判断是否是0-9之间, 计数器+1
在NSString+count.h中
#import <Foundation/Foundation.h>
@interface NSString (count)
-(void)countStrNum;
@end@implementation NSString (count)
-(void)countStrNum{int count = 0;for (int i = 0; i<self.length; i++){unichar c = [self characterAtIndex: i];if (c >= '0' && c <= '9'){count++;}}NSLog(@"count = %d", count);
}
@end
Category延展
- 1.延展概念
-
延展类别又称扩展(Extendsion)
Extendsion是Category的一个特例
其名字为匿名(为空),并且新添加的方法一定要予以实现。(Category没有这个限制)
@interface MyClass(){float value;
}
-(void)setValue:(float)newValue;
@end
这种写法的类别叫匿名类别,又叫类扩展,其实就是为一个类添加额外的原来没有的变量、方法或者合成属性。
- 2、延展的实现
- 通过延展来实现方法的私有,延展的头文件独立。这种方法不能实现真正的方法私有,当在别的文件中引入延展的头文件,那么在这个文件中定义的类的对象就可以直接调用在延展中定义的所谓的私有方法
.h文件
#import <Foundation/Foundation.h>@interface Person : NSObject
@property int age;
-(void)run;
@end//延展类别
//可以在延展中 定义实例变量
@interface Person()
{
float _weight;
}
-(void)run;
@end
.m文件@implementation Person
-(void)run{NSLog(@"延展的run方法");
}
@end
//注意,方法的实现不能写@implementation Person() @end不能有括号
第二种实现延展的方式是延展没有独立的头文件
.m文件
@interface Person()
-(void)run;
@end@implementation Person
-(void)run{NSLog(@"延展的run方法");
}
@end
在头文件中写一个对外开放的方法,在.m中声明和实现私有方法,让对象同过调用对外开放的方法来间接调用.m中的私有方法,这样就达到了延展中方法的私有
Category(分类)相关推荐
- 【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 Category 分类进行方法注入的优缺点 )
文章目录 一.使用 Category 分类进行方法注入的优点 二.使用 Category 分类进行方法注入的缺点 一.使用 Category 分类进行方法注入的优点 之前的博客 [Groovy]MOP ...
- 【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 Category 分类注入方法 )
文章目录 一.方法注入 二.使用 Category 分类注入方法 三.完整代码示例 一.方法注入 在之前的博客中 , 主要是使用 Groovy 元编程 拦截方法 , 改变方法的实现 ; 使用元编程还可 ...
- Category 分类、类别 总结 - iOS
分类作用 分类:可以给某一个类扩充一些方法(不修改原来类的代码) 格式 // 声明 @interface Person (分类名称)@end// 实现 @implementation Person ( ...
- Category(分类/类目)、Protocol(协议)、Extension(扩展/延展)
Category(分类/类目): 利用Objective-C的动态运行时分配机制,Category提供了一种比继承更为简洁的方法来对class进行扩展,无需创建对象类的子类就能为现有的类添加新方法,可 ...
- woocommerce 分类到菜单_Woocommerce教程:添加和编辑产品Category分类
在使用WordPress的woocommerce商城插件制定商城的时候, 如果你公司拥有众多产品, 那么应该需要给这些产品添加Category分类, 以便分类管理产品, 让网站访客更快地找到自己想要的 ...
- Category(分类)的创建和使用
分类的作用与注意事项: 可以在不修改原来类的基础上,为一个类扩展方法. 最主要用法是给系统自带的类扩展方法. 分类中只能添加"方法",不能增加成员变量. 分类中可以访问原来类中的成 ...
- id、构造方法、Category 分类、类的本质、description方法、SEL
1.id: 万能指针id :id对象不能用点语法.id对象本身已经有 * 了 因此变量名不能有 * . 可以吧id理解为 NSObject * 类型数据! int main() { @autorele ...
- 《黑马程序员》 category分类的使用(Objective - c语法)
------- <a href="http://www.itheima.com" target="blank">android培训</a> ...
- oc的分类category
category分类,指的是可以将类无尽的拓展起方法,是不能拓展属性的.类名后面有个括号代表这个类是分类eg: #import "Student.h" @interface Stu ...
- OC 中的分类(Category)详解
1.Category 分类.类别 2.分类:可以给某一个类扩充一些方法(不修改原来类的代码) 3.分类也分为声明(放在.h文件)和实现(放在.m文件): 分类的声明格式如下 @interface 类 ...
最新文章
- 【基础知识】如何快速转发CSDN博客
- linux安装mysql5.7自己初始化_linux系统安装mysql5.7步骤
- 【Scratch】青少年蓝桥杯_每日一题_4.13_猫捉老鼠
- HTML中Div、span、label标签的区别
- C语言深度剖析书籍学习记录 第五章 内存管理
- 【积少成多】vi的进阶使用
- CodeForces 828C String Reconstruction(并查集思想)
- Android自定义事件总线,手写Android事件总线框架Eventbus(简易版)
- 什么是身份证ocr识别?身份证ocr识别接口API能干什么?
- JAVA连接SQL server2000解决方法
- esp8266教程:定时器之原理基础
- 程序员爆笑段子,外行人根本看不懂
- ReID中PCB模型输出维度_搞定PCB信号完整性,只需9步!都可以学会
- Qt 可拖拽 大小可调 方框
- 2019/7/18ACM集训
- hive开窗/窗口函数
- 如何快速提高网站权重?
- 网络协议 -- HTTPS(2)数字签名与数字证书
- HTML5 知识点(第一节)
- Ubuntu系统挂载固态硬盘
热门文章
- Java基础-day18-反射方法应用·暴力反射·内部类
- UE4导入的fbx让模型动起来
- MySql8.x 修改密码
- IOS版微信新功能!朋友圈评论支持表情包
- Python项目体系练习500例(附源代码),练完可就业
- VS #region
- AI绘图实战(十一):将纸质儿童画修改为电子照片/3D Openpose插件使用 | Stable Diffusion成为设计师生产力工具
- html中隐藏div的高度,jQuery如何获取隐藏元素的高度?
- 晋中计算机专业对口大学,山西晋中计算机专业学校排名太重技校专业院校
- Android版酷狗音乐 v9.0.1 去广告SVIP珍藏V2版