黑马程序员----oc加强笔记----分类(Gategory)
来源:互联网 发布:淘宝泊泉雅都是假的吗 编辑:程序博客网 时间:2024/05/21 03:56
1、类别的概念及作用
类别概念
Category有很多种翻译: 分类\类别\类目 (一般叫分类)
Category是OC特有的语法, 其他语言没有的语法(类似于C#语言中的”扩展方法”和”partial”关键字)
类别的作用
在不修改原有的类的基础上增加新的方法
一个庞大的类可以分模块开发
一个庞大的类可以由多个人来编写,更有利与团队合作
使用类别的目的
1)对现有类进行扩展:
比如,你可以扩展Cocoa touch框架中的类,你在类别中增加的方法会被子类所继承,而且在运行时跟其他 的方法没有区别。
2)作为子类的替代手段:不需要定义和使用一个子类,你可以通过类别直接向已有的类里增加方法。
3)对类中的方法归类:利用category把一个庞大的类划分为小块来分别进行开发,从而更好的对类中的方 法进行更新和维护.
2、使用类别的步骤
先声明类别--->实现类别--->使用类别
3、分类的声明和实现
分类:
一些方法的声明和实现
作用:在不修改类的源代码的前提下,给类增加新的功能
使用步骤:
//此处是声明一个类
@interface Person : NSObject
@end
//类的实现
@implementation Person
@end
1)声明一个分类
格式:
@interface待扩展的类名 (分类的名称)
@end
Person+base -->分类文件的命名规则
eat run
如:
@interface Person (base)
//吃
-(void)eat;
//跑
-(void)run;
@end
2)实现这个分类
格式:
@implementation待扩展的类 (分类的名称)
@end
如:
Person+base类别实现
@implementation Person (base)
//吃
-(void)eat{
NSLog(@"人会吃东西");
}
//跑
-(void)run{
NSLog(@"人会跑")
}
@end
3)使用分类中的方法
和使用类中原有的对象一样
Person *p = [Person new];
[p xxx];
playGame类别 ---张三
playlol playdota
study类别 --- 李四
studyc studyios
创建一个Person类,声明和实现部分
<span style="font-size:18px;">#import <Foundation/Foundation.h>@interface Person : NSObject//person类原有的属性和方法@end//给Person类增加新的方法// 声明一个分类@interface Person (base) //吃 -(void)eat; //跑 -(void)run;@end</span>
<span style="font-size:18px;">#import "Person.h"//实现一个类别@implementation Person (base)//吃-(void)eat{ NSLog(@"人会吃东西");}//跑-(void)run{ NSLog(@"人会跑"); }@end@implementation Person//类原有的方法的实现@end</span>
声明一个分类(Person+study)声明和实现:
<span style="font-size:18px;">#import "Person.h"@interface Person (study)-(void)studyC;-(void)studyIOS;@end</span>
<span style="font-size:18px;">#import "Person+study.h"@implementation Person (study)-(void)studyC{ NSLog(@"那人正在学习C语言"); }-(void)studyIOS{ NSLog(@"那人正在学习IOS");}@end</span>
声明另一个分类(Peson+playGame),声明和实现:
<span style="font-size:18px;">#import "Person.h"@interface Person (playGame)//增加一个类别,类别名称 playGame 给Person增加新的方法-(void)playLol;-(void)playDota;@end</span>
<span style="font-size:18px;">#import "Person+playGame.h"@implementation Person (playGame)-(void)playLol{ NSLog(@"那人正在玩撸啊撸");}-(void)playDota{ NSLog(@"那人正在玩刀塔");}@end</span>实现分类中的方法:
<span style="font-size:18px;">#import <Foundation/Foundation.h>#import "Person.h"#import "Person+playGame.h" //分类的声明的头文件#import "Person+study.h"int main(int argc, const char * argv[]) { @autoreleasepool { Person *p = [Person new]; [p eat]; [p run]; [p playLol]; [p playDota]; [p studyC]; [p studyIOS]; } return 0;}</span>结果:
4、分类的使用注意事项:
1)分类只能增加方法,不能增加成员变量、@property(可能编译不报错,但是运行有问题)
2)分类可以访问原来类中的成员变量
4)分类的编译顺序最下面的是最后编译,当多个分类中有同名方法,则执行最后编译的文件方法
<span style="font-size:18px;">#import <Foundation/Foundation.h>@interface Gun : NSObject@end</span>
<span style="font-size:18px;">#import "Gun.h"@implementation Gun@end</span>创建一个人类声明并实现:
<span style="font-size:18px;">#import <Foundation/Foundation.h>@interface Person : NSObject@end</span>
<span style="font-size:18px;">#import "Person.h"@implementation Person@end</span>
创建一个协议:
<span style="font-size:18px;">#import <Foundation/Foundation.h>//这时一个类别// 给NSObject类增加的// 类别的名称 run// 这是一个非正式协议@interface NSObject (run)-(void)eat;-(void)run;@end</span>
<span style="font-size:18px;">#import "NSObject+run.h"@implementation NSObject (run)-(void)eat{ NSLog(@"会吃东西");}-(void)run{ NSLog(@"会跑");}@end</span>
实现协议中的方法:
<span style="font-size:18px;">int main(int argc, const char * argv[]) { @autoreleasepool { Person *p = [Person new]; [p eat]; Gun *gun = [Gun new]; [gun eat]; [gun run]; } return 0;}</span>6、类的延展
延展类别又称为扩展(Extendsion)
Extension是Category的一个特例其名字为匿名(为空),并且新添加的方法一定要予以实现。(Category没有这个限制)@interfaceStudent ()
@end
2、延展的实现
通过延展来实现方法的私有,延展的头文件独立。这种方法不能实现真正的方法私有,当在别的文件中引入延展的头文件,那么在这个文件中定义的类的对象就可以直接调用在延展中定义所谓私有的方法
//对类的延展-隐藏方法wrap的一种手段(非强制).h文件
@interface SceneManager ()
+ (void) wrap;
@end
.m类的实现文件中@implementation SceneManager+ (void) wrap {
NSLog(@"method of wrap");}
@end 想
<span style="font-size:18px;"><span style="font-size:18px;"></span></span>
创建一个Person类别,声明部分:
<span style="font-size:18px;"><span style="font-size:18px;">#import <Foundation/Foundation.h>@interface Person : NSObject@property int age;//setAge//age//_age-(void)test;@end</span></span>
创建一个Person的延展类:
<span style="font-size:18px;"><span style="font-size:18px;">#import "Person.h"@interface Person (){ int _height;}-(void)work;@end</span></span>实现类:
<span style="font-size:18px;"><span style="font-size:18px;">#import "Person.h"#import "Person_work.h"//扩展\延展\延展分类//延展是一个特殊的分类//特点:// 1) 可以在延展中 定义实例变量// 2) 不能使用 @implementation 类名() 实现类别的方法// 3) 作用,可以定义私有的变量和方法@interface Person (){ float _weight;}-(void)run; //run 相对私有的方法@end@implementation Person-(void)run{ NSLog(@"延展的run方法 %.2f",_weight);}// Person_work.h 声明的,延展-(void)work{ NSLog(@"work %d",_height);}-(void)test{ [self run]; [self work];}@end</span></span>
- 黑马程序员----oc加强笔记----分类(Gategory)
- 黑马程序员----oc加强笔记----内存管理
- 黑马程序员----oc加强笔记----Foundation\NSString
- 黑马程序员----oc加强笔记----block
- 黑马程序员-OC加强-Block
- 黑马程序员--OC--分类
- 黑马程序员——ios学习笔记 OC 分类
- 【黑马程序员-学习笔记】OC-协议与分类
- 黑马程序员---OC学习笔记之分类(Category)延展
- 黑马程序员---OC分类-category
- 黑马程序员--学习OC加强内存管理
- 黑马程序员-OC加强回顾-内存管理
- 黑马程序员-OC加强-内存管理
- 黑马程序员--OC笔记
- 【Objective-C学习笔记】核心语法——分类-Gategory
- 黑马程序员-oc中分类的使用
- 黑马程序员IOS-OC语言-分类、协议
- 黑马程序员--oc分类
- JavaBean的使用
- Hadoop 实例8 Join讲解1: 获取员工所在部门信息
- random函数随想(游戏中的随机数)
- hadoop 自学指南三之wordcount 解析(1)
- JAVA自学第一天
- 黑马程序员----oc加强笔记----分类(Gategory)
- 快递点短信发送软件(快递哥的好帮手)
- 大数据产品-腾讯信鸽之手游流失预测
- Linux shell基本运算需要注意空格
- Unmarshalling Error: 意外的元素的问题的解决
- 让Pig在风暴中飞驰——Pig On Storm
- 最好的肋骨
- ubuntu14安装RabbitVCS
- Tornado设置http的响应头header