今天给大家介绍一下我们常说的Category的详细用法,首先引用API文档的一段话:
You use categories to define additional methods of an existing class—even one whose source code is unavailable to you—without subclassing.
从这段话中我们可以看出Category(范畴)的本质:
在不需要继承一个父类的情况下来实现另外的类中的某些方法,哪怕那个类的源代码不是开源的。
那么说到源代码不开源,我们首当其冲地就想到了iOS的SDK(也就是Cocoa Touch 框架),我们只能查看他们的头文件声明但是不能查看.m文件的实现。所以范畴用的比较多的情况就是在我们自己的类中去实现SDK中某个类的既有方法。
当然我们也可以在我们自己写的两个类中间使用category,这种情况一般有两种:
1.当我们一个类过于庞大的时候我们可以将它拆分成若干个category,在各个category的.m文件中去实现,这样避免主类的.m实现文件过长和混乱。
2.声明私有方法。
这些都应该好理解的,可能我的描述也有一些地方不够精确,但应该没有大的偏差,主要是用的时候理解对就行了。我们来看看category的声明方式:
#import "SystemClass.h" //这里的.h文可能是某些我们无法查看.m源文件的类的头文件声明,就是我刚刚说的第一种情况
@interface SystemClass (CategoryName) //这里的()括起来的地方就是我们Category(范畴)的名字了,在SDK源代码中或者XMPPFramework中我们也经常看到这种声明
// 在这里声明你要实现的方法
@end
#import
#import "XMPPMessage.h"
@interface XMPPMessage(XEP0045)
- (BOOL)isGroupChatMessage;
- (BOOL)isGroupChatMessageWithBody;
@end
如果你是想用Category声明私有方法,那么只需要在你的类的.h文件的@implementation标记前面加上这个Category的声明即可了,不需要单独去创建新的xxx+xxx.h文件,这个跟我们的@protocal写法很类似,例如:
#import "MyClass.h"
@interface MyClass (PrivateMethods)
// PrivateMethods范畴的私有方法声明
@end
@implementation MyClass
// 普通方法的声明
@end
除开这个,我们更为普通的情况是我们如果基于一个无法查看源代码的类之上写了一个Category,这个时候我们由于没有"父类"的.m文件的查看和修改权利,所以我们只有创建一个xxxx+xxxx.h/.m文件在里面实现Category的扩展方法,实现方式如下:
#import "SystemClass+CategoryName.h"
@implementationSystemClass ( CategoryName )
//category扩展的方法簇
@end
其实看到这里,我只想说,这一段代码看起来就如同这一段java代码:
public interface CategoryName extends SystemClass{
//Category中的接口
}
有没有?