您的位置:首页 > 编程语言 > Go语言

类别(Category)与扩展(Extension)

2016-12-19 21:28 288 查看
一、类别(又叫分类):类别的小括号中必须有名字

作用:主要是即使在你不知道一个类的源码情况下,向这个类添加扩展的方法。同时候我们也可以不用继承系统类,直接给系统类添加方法,最大程度的体现了Objective-C的动态语言特性

使用格式:

@interface 类名(**分类名字**)
/*方法声明*/
@end
@implementation类名(分类名字)
/*方法实现*/
@end


例如:这是一个最简单的Category,作用于NSObject类,给NSObject添加了一个方法。

#import
@interface NSObject (Category)
- (void)myMethod;
@end


使用Category需要注意:

(1) Category的方法不一定非要在@implementation中实现,也可以在其他位置实现,但是当调用Category的方法时,依据继承树没有找到该方法的实现,程序则会崩溃。

(2) Category理论上不能添加变量,但是可以使用@dynamic 来弥补这种不足。 (即运行时Runtime)

(3)不可以调用super方法。–类别的局限

(4)类别的方法优先级较高,可覆盖原类方法。

category使用 objc_setAssociatedObject/objc_getAssociatedObject 实现添加属性

//例1
@interface NSObject (CategoryWithProperty)

@property (nonatomic, strong) NSObject *property;

@end

@implementation NSObject (CategoryWithProperty)

- (NSObject *)property {
return objc_getAssociatedObject(self, @selector(property));
}

- (void)setProperty:(NSObject *)value {
objc_setAssociatedObject(self, @selector(property), value, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end


//例2
#import
static const void * externVariableKey=&externVariableKey;
@implementation NSObject (Category)
@dynamic variable;
- (id) variable
{
return objc_getAssociatedObject(self, externVariableKey);
}
- (void)setVariable:(id) variable
{
objc_setAssociatedObject(self, externVariableKey, variable, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}


二、类扩展 (Extension也有人称为匿名分类)

作用:能为某个类附加额外的属性,成员变量,方法声明;

一般的类扩展写到.m文件中;一般的私有属性写到类扩展

使用格式:

@interface Mitchell()
//属性
//方法
@end




@interface MyClass : NSObject
@property (retain, readonly) float value;
@end
//一般的时候,Extension都是放在.m文件中@implementation的上方。
@interface MyClass ()
@property (retain, readwrite) float value;
@end


使用Extension需要注意:

Extension中的方法必须在@implementation中实现,否则编译会报错。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: