Category(类别)是一种为现有的类添加新方法的方式。
创建Category
Category的代码一般是放在独立的文件中,文件的命名通常是“类名称+类别名称”的风格,使用Xcode可以帮你快速建立类别的文件:File-->New-->File-->Objective-C File,将File Type改为Category,并输入类名和类别名,点击Next即可(Xcode 6)。
#import <Foundation/Foundation.h>
@interface NSString (myCategory)
@end
以上就是创建了名为myCategory的NSString类别的@interface部分。
使用Category
你可以在其中列出你要添加的方法,也可以添加属性,但是不能添加实例变量,而且属性必须是@dynamic(要自己实现setter和getter方法)。你需要在类别的@implementation部分实现自己的方法。例如:
#import <Foundation/Foundation.h>
@interface NSString (myCategory)
+ (NSUInteger)lengthOfString:(NSString *)string;
@end
#import "NSString+myCategory.h"
@implementation NSString (myCategory)
+ (NSUInteger)lengthOfString:(NSString *)string
{
return [string length];
}
@end
#import <Foundation/Foundation.h>
#import "NSString+myCategory.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
NSUInteger length = [NSString lengthOfString:@"hello world!"];
NSLog(@"%d",(int)length);
}
return 0;
}
运行结果:
2015-04-18 16:54:32.183 category[7100:221796] 12
Category的缺陷
类别有两个局限性:
- 无法向Category中添加实例变量,Category中没有空间容纳实例变量;
- 名称冲突。Category中的方法可以与现有方法重名,而Category中的方法优先级更高,会导致原有的方法不再可用,可以向类别方法名添加前缀来解决。