类别(Category)与扩展(Extension)

本文详细介绍了Objective-C中的类别(Category)和类扩展(Extension)的概念、使用方法及注意事项。类别允许开发者向现有类添加新方法而不需继承,而类扩展则用于定义类的私有接口。

一、类别(又叫分类):类别的小括号中必须有名字

作用:主要是即使在你不知道一个类的源码情况下,向这个类添加扩展的方法。同时候我们也可以不用继承系统类,直接给系统类添加方法,最大程度的体现了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中实现,否则编译会报错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值