Objective-C中的类别

2016/4/6 0:9 上午 posted in  Objective C comments

刚刚翻看了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.若两个类别都定义了一个相同类的相同方法,运行时实际无法确定调用哪一个。