刚刚翻看了OC的书中关于类别的一章,现将OC中类别的使用和限制总结如下。
定义及使用
1.通过在类上声明和实现方法来扩展现有类的功能,且不需要访问要扩展类的原有代码。
2.类别不是子类,添加的方法可以直接在操作的类中使用,因此可以避免通过继承的方式添加某些方法的实现。
3.可以通过类别重写现有方法,但一般不推荐,这样会导致无法调用被扩展的类的初始方法,只能访问重写过的方法。
声明
头文件
#import <Foundation/Foundation.h>
@interface NSMutableString (GUID) //括号里为类别的名字
-(void) appendGUID;
+(id) stringWithGUID;
@end
实现
#import "NSMutableString+GUID.h"
@implementation NSMutableString (GUID)
-(void) appendGUID{
CFUUIDRef uuid = CFUUIDCreate(kCFAllocatorDefault);
NSString *string = (NSString *)CFBridgingRelease(CFUUIDCreateString(kCFAllocatorDefault, uuid));
[self appendString:string];
// CFRelease(uuid);
}
+(id) stringWithGUID{
NSMutableString *string = [self string];
[string appendGUID];
return string;
}
@end
扩展成员方法:可访问类的所有成员变量、可以通过self调用类的其它方法、可以使用super关键字调用父类的方法。self关键字指实例对象。
扩展类方法:无法访问成员变量。self关键字指类对象。
使用
#import <Foundation/Foundation.h>
#import "NSMutableString+GUID.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSMutableString *str = [NSMutableString stringWithGUID];
NSLog(@"GUID=%@", str);
}
return 0;
}
限制
1.类别不能在扩展类中添加任何成员变量。
2.重写现有方法时,无法调用原始现有对象方法。
3.若两个类别都定义了一个相同类的相同方法,运行时实际无法确定调用哪一个。