OC特有的分类Category,依赖于类。它可以在不改变原来的类内容的基础上,为类增加一些方法.
- 分类只能增加方法,不能增加成员变量;
- 在分类方法的实现中可以访问原来类中的成员变量mBook;
- 分类中可以重新实现原来类中的方法,但是会覆盖掉原来的方法,导致原来的方法无法再使用;
- 方法调用的优先级:分类->原来的类->父类,若包含有多个分类,则最后参与编译的分类优先;
上代码
对student类,里面的方法是在是太单调了,只有一个keepBook的方法,现在我需要让他支持一个动作:”阅读书本”。但是我又不想更改这段Student代码。这时,我就使用分类了
#import "Student.h"
@interface Student (Read)
-(void)readBook;
@end
实现文件代码如下:
#import "Student+Read.h"
@implementation Student (Read)
-(void)readBook{
//因为咱们的Book已经声明好了description方法
//所以咱们直接用%@就可以答应书本的内容了
//不清楚的同学可以看下上篇博客
NSLog(@"书本的内容是>>>>%@",[self mBook]);
}
@end
这样,咱么就已经成功的给student这个类扩充了一个readBook这个方法了
3.接下来咱们就应该去调用这个新的student了
因为我们要使用的是扩展的这个Student对象,所以咱们应该import”Student+Read.h”这个头文件
看代码:
#import <Foundation/Foundation.h>
//导入book和student的声明
#import "Book.h"
//#import "Student.h"
#import "Student+Read.h"
//这是一个简单的宏,java写多了,各位理解万岁
#define ptr_(m) *(m)
int main(int argc, const char * argv[])
{
@autoreleasepool {
//先创建一个Book对象
Book ptr_(mBook)=[[Book alloc]initWithPages:200 andContents:@"我是内容"];
//创建一个Student对象
Student ptr_(mStudent) =[[Student alloc]initWithId:250];
//让学生持有一本书
[mStudent keepBook:mBook];
//调用这个扩充过的读书代码
[mStudent readBook];
//释放书籍对象
[mBook release];
//释放学生对象
[mStudent release];
}
return 0;
}
运行结果