OC学习笔记——类别(Category)

类别,有些程序员又称之为分类。

类别是一种为现有的类添加新方法的方式,尤其是为系统的做扩展的时候,不用继承系统类,可以直接为类添加新的方法。也可以覆盖系统类的方法。

如:

@interface NSObject (MyCategory)

- (void)myMethod;

@end

这样我们就给NSObject 添加了一个方法 myMethod()。

注意,一般情况下,我们只用分类为现有类添加方法,而很少为现有类添加属性。

假设我们有一个Person 类

person.h

1 @interface Person : NSObject
2 @property(nonatomic,strong) NSString *name;
3 @property(nonatomic,assign)NSUIteger age;
4 -(void)job;
5 @end

person.m

1 #import "Person.h"
2
3 @implementation Person
4 -(void)job{
5     NSLog(@"工作不加班,工作不加班");
6 }
7 @end

现在我们为Person创建一个分类

Person+Weapon.h

1 #import "Person.h"
2 @interface Person (Weapon)
3 -(void)fire;
4 @end

Person+Weapon.m

1 #import "Person+Weapon.h"
2
3 @implementation Person (Weapon)
4 -(void)fire{
5     NSLog(@"%@具备了开火的能力 ",self.name);
6 }
7 @end

main.m

 1   #import <Foundation/Foundation.h>
 2   #import "Person.h"
 3   #import "Person+Weapon.h"
 4   int main(int argc, const char * argv[])
 5   {
 6
 7       @autoreleasepool {
 8           Person *person = [[Person alloc]init];       
 9           person.name = @"小王";
10           [person job];
11           [person fire];
12      }
13      return 0;
14  }

运行结果:
2015-07-25 13:35:06.111  分类[1065:68110] 工作不加班,工作不加班
2015-07-25 13:35:06.112  分类[1065:68110] 小王具备了开火的能力!

通过以上例子可以看出,本来类Person 只有一个job工作的能力,我们通过分类weapon,为Person添加了新的方法开火。

有时我们也需要运用分类给,可以使用runtime机制为类别添加属性。
方法如下:
1、在定义类别之前引如runtime
#import<obj/runtime.h>
2、定义、实现类别

Person+Weapon.h

1 #import <objc/runtime.h>
2 #import "Person.h"
3 @interface Person (Weapon)
4 @property (nonatomic,retain) NSString *address;//分类中添加的新属性address
5 -(void)fire;
6 @end

Person+Weapon.m

 1 #import "Person+Weapon.h"
 2 static const char *addressKey = "上海浦东";
 3 @implementation Person (Weapon)
 4 -(void)fire{
 5     NSLog(@"%@具备了开火的能力!",self.name);
 6 }
 7 //getter
 8 - (NSString *)address {
 9     return (NSString *)objc_getAssociatedObject(self, addressKey);
10 }
11 //setter
12 - (void)setAddress:(NSString *)newAddressKey {
13     objc_setAssociatedObject(self, addressKey, newAddressKey, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
14 }
15 @end

main.m

 1 #import <Foundation/Foundation.h>
 2 #import "Person.h"
 3 #import "Person+Weapon.h"
 4 int main(int argc, const char * argv[])
 5 {
 6
 7     @autoreleasepool {
 8         TRPerson *person = [[Person alloc]init];
 9         person.name = @"小王";
10         person.address = @"北京天安门";
11         NSLog(@"%@搬家到%@",person.name,person.address);
12         [person job];
13         [person fire];
14     }
15     return 0;
16 }

运行结果:

2015-07-25 14:01:09.672  分类[1097:76981] 小王搬家到北京天安门
2015-07-25 14:01:09.673  分类[1097:76981] 工作不加班,工作不加班
2015-07-25 14:01:09.673  分类[1097:76981] 小王具备了开火的能力!

类别的作用:

   (1)将类的实现分散到多个不同文件或多个不同框架中。
       (2)创建对私有方法的前向引用。(个人感觉最主要的作用就是欺骗编译器,如果编译器找不到相关的函数,我们可以用分类声明一个,不必实现而让编译器通过编译)
       (3)向对象添加非正式协议。(非正式协议是NSObject的一个类别,他可以列出对象能够响应的方法)

时间: 2024-10-16 07:07:18

OC学习笔记——类别(Category)的相关文章

Snail—OC学习之类别Category

类别就是向类添加一些有用的功能或者方法 利于开发 类可以是系统类.可以是自定义类 类别跟子类是不一样的,类别只能添加一些方法 属性变量什么的不可以添加 不创建新类,即可对已有类进行扩展 做项目的时候 跟其他程序员会更好的合作 新建类别的图放在最后面 我们为系统类NSArray添加一个打印方法 使得能输出中文 界面如下 然后再NSArray+MyNSLog.h中声明一个函数 #import <Foundation/Foundation.h> @interface NSArray (MyNSLog

OC学习笔记 xcode6 category 分类创建和使用

xcode6 分类 catepory 位置

iOS学习笔记06—Category和Extension

iOS学习笔记06—Category和Extension 一.概述 类别是一种为现有的类添加新方法的方式. 利用Objective-C的动态运行时分配机制,Category提供了一种比继承(inheritance)更为简洁的方法来对class进行扩展,无需创建对象类的子类就能为现有的类添加新方法,可以为任何已经存在的class添加方法,包括那些没有源代码的类(如某些框架类). 二.示例 1.声明类别 @interface NSString (CategoryDemo) -(NSNumber*)

黑马程序员-OC学习笔记之Foundation框架NSNumber、NSValue和NSDate

---------------------- IOS开发.Android培训.期待与您交流! ---------------------- 一.NSNumber 前几篇笔记中,小桥复习了Foundatio框架中的几个类,这三个是OC学习的尾声了. 小桥已经复习过OC数组类NSArray,也说过它只能存放OC的对象,对于基本的数据类型确无能为力,但是实际编程中经常要把基本的数据如int.float,结构体存放的OC数组中,怎么办?这里的NSNumber就有用了,它能够把基本数据类型包装成OC对象.

黑马程序员-OC学习笔记之block

过山车 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 9426    Accepted Submission(s): 4151 Problem Description RPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了.可是,过山车的每一排只有两个座位,而且还有条不成文的规矩,就是每个女生必须找个个男生做par

黑马程序员-OC学习笔记之ARC

---------------------- IOS开发.Android培训.期待与您交流! ----------------------一.什么是ARC        ARC是自动引用计数,苹果官方在Xcode4.2及以后版本中加入的一个内存管理机制,完全取代了程序员人工的内存管理,使得程序员只须关心程序本身.使用ARC,编译器会自动在代码中加入内存管理代码,是一个编译器特性,而不是运行时特性,当然,它也和JAVA的垃圾回收不同,它的本质和手动的内存管理是一样的,只是这些代码编译器会自动添加.

黑马程序员-OC学习笔记之NSString与NSMutableString

---------------------- IOS开发.Android培训.期待与您交流! ---------------------- 一.NSString与NSMutableString 相信大家对NSString类都不陌生,它是OC中提供的字符串类,它的对象中的字符串都是不可变的,而它的子类NSMutableString类的对象中的字符串就是可变的.什么是可变与不可变呢?二者的区别就是在已经创建的一个字符串对象中,在程序中能不能更改字符串,比如拼接新的字符串,可变的可以在原字符串中更改,

黑马程序员——OC学习笔记—— Copy

黑马程序员——OC学习笔记—— Copy ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- copy 即对象拷贝 要使用对象数据而不希望修改对象时,可以使用copy copy叫做浅拷贝  mutablecopy深拷贝 copy需要遵守NSCopying协议,实现CopywithZone方法 MutableCopy也一样要遵守相应协议 注意: OC中copy复制的对象都是不可变的  mutablecopy复制的是可变副本 浅拷贝:只拷贝地址,不

黑马程序员-OC学习笔记之Foundatio框架集合类

---------------------- IOS开发.Android培训.期待与您交流! ---------------------- 一.OC数组 OC数组是一个类,它也分不可变数组NSArray和可变数组NSMutableArray. 1?不可变数组的创建 // 创建一个不可变数组,元素为一个OC字符串对象 @"小桥" NSArray *array1 = [NSArray arrayWithObject:@"小桥"]; // 创建一个不可变数组,元素为多个O