【黑马程序员】Category(分类)
2015-08-24 01:13
363 查看
——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
Category的概念及使用流程
Category声明和实现
Category使用注意
Category非正式协议
Category延展
Category有很多种翻译:分类\类别\类目(一般叫做分类)
Category是OC特有的语法,其他语言没有的语法(类似于C#语言中的”扩展方法”和”partial”关键字)
二、类别的作用
在不修改原有的类的基础上增加新的方法;
一个庞大的类可以分模块开发
一个庞大的类可以由多个人来编写,更有利于团队合作
三、使用类别的目的
1)对现有类进行扩展:
比如,你可以扩展Cocoa touch框架中的类,你在类别中增加的方法会被子类所继承,而且在运行时跟其他的方法没有区别
2) 作为子类的替代手段
不需要定义和使用一个子类,你可以通过类别直接向已有的类别里增加方法。
3)对类中的方法归类
利用Category把一个庞大的类划分为小块来分别进行开发,从而更好的对类中的方法进行更新和维护。这样条理更加清晰
三、使用类别的步骤
先声明类别->实现类别->使用类别
类别的命名规则:类名+扩展方法,如”NSString+countNum”。
类别的接口声明与类的定义十分相似,但类别不继承父类,只需要带有一个括号,表面类别的主要用途
在.h文件中,声明类别:
声明类格式:
1)新添加的方法必须写在@interface 与 @end 之间
2 ) ClassName 现有类的类别(要为哪个类扩展方法)
3)CategoryName 待声明的类别名称
4)NewMethod 新添加的方法
注意
不允许在声明类别的时候定义变量
不允许在声明类别的时候定义变量
不允许在声明类别的时候定义变量
重要的事情要说三遍
实现类别
在.m文件中(也可以在.h中实现),实现类别:
实现类别格式:
1)新添加的方法必须写在@implementation与 @end 之间
2 ) ClassName 现有类的类名
3)CategoryName 待声明的类别名称
4)NewMethod 新添加的方法的实现
也可以通过图形界面生成类别
抵用类别中的方法
与一般成员方法调用形式完全一样
需要包含类别的头文件
2.如果分类和原来类出现同名的方法,优先调用分类中的方法,原来类中的方法会被忽略
3.分类的编译顺序
最下面的是最后编译,当多个分类中有同名方法,则执行最后编译的文件方法
思考&实现:
统计一个字符串中阿拉伯数字的个数
NSString * str = @”asdjasdjsaldk1 1j2k1 2lkas”;
思路:
取出字符串的每一个字符
判断是否是0-9之间, 计数器+1
在NSString+count.h中
延展类别又称扩展(Extendsion)
Extendsion是Category的一个特例
其名字为匿名(为空),并且新添加的方法一定要予以实现。(Category没有这个限制)
这种写法的类别叫匿名类别,又叫类扩展,其实就是为一个类添加额外的原来没有的变量、方法或者合成属性。
2、延展的实现
通过延展来实现方法的私有,延展的头文件独立。这种方法不能实现真正的方法私有,当在别的文件中引入延展的头文件,那么在这个文件中定义的类的对象就可以直接调用在延展中定义的所谓的私有方法
第二种实现延展的方式是延展没有独立的头文件
在头文件中写一个对外开放的方法,在.m中声明和实现私有方法,让对象同过调用对外开放的方法来间接调用.m中的私有方法,这样就达到了延展中方法的私有
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中的私有方法,这样就达到了延展中方法的私有
相关文章推荐
- 剑指Offer面试题:9.二进制中1的个数
- 到csnd的第一篇博客,记录一个菜鸟程序员的成长历程。
- 怎样成为一个优秀的程序员,而不是一个优秀的码农?
- 9秒学院:程序员从优秀到卓越的几点建议
- 软件开发需要学习什么?
- 蜂窝教育助力IT行业发展
- 我28岁了,还能成为一名程序员吗?迷茫和沮丧中
- 黑马程序员——初识反射
- 黑马程序员——Java工具类概述
- [不断更新]前端工程师面试必备知识清单
- 黑马程序员--正则表达式
- 腾讯实习求职经历-百转千回终取offer(后附大量面试题)
- 黑马程序员—学习笔记—接口
- 黑马程序员—学习笔记4-PrintStream
- 华为数字芯片实习面试经过
- 黑马程序员—学习笔记3—经典的丢手绢程序
- 黑马程序员——27,正则表达式
- 黑马程序员 --- OC中的类
- 华为数字芯片工程师实习生面试全过程
- 黑马程序员_java基础第一部分