分类和类扩展

 分类(Category) 和 类扩展(Extension) 

分类(Category)

1、给已经存在的类增加方法(可以不实现),不能增加成员变量(可以通过Runtime来给分类添加属性)

2、分类可以访问原来类中的成员变量

3、如果分类和原来的类出现同名的方法,优先调用分类中的方法     优先级是:分类 (最后参与编译) -> 原来类 -> 父类

4、分类可以重新实现原来类中的方法,但是会覆盖掉原来类方法,导致原来类的方法无法使用

优点: 1、减少单个文件的体积   2、把不同的功能组织到不同的Category 中,方便多个开发者完成一个类  3、声明私有方法   4、模仿多继承等

通过运行时给分类添加属性:

@interface NSObject (SpecialName)
@property (nonatomic, copy) NSString *specialName;
@end
#import "NSObject+Extension.h"
#import <objc/runtime.h>
static const void *SpecialNameKey = &SpecialNameKey;    
@implementation NSObject (SpecialName)
@dynamic specialName;

- (NSString *)specialName {
    //如果属性值是非id类型,可以通过属性值先构造OC的id对象,再通过对象获取非id类型属性
    return objc_getAssociatedObject(self, SpecialNameKey);
}
- (void)setSpecialName:(NSString *)specialName{
    //如果属性值是非id类型,可以通过属性值先构造OC的id对象,再通过对象获取非id类型属性
    objc_setAssociatedObject(self, SpecialNameKey, specialName, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
} 
@end

类扩展(Extension)

1、类扩展是分类的一个特例(Extension 是 Category 的一个特例) ,也称作匿名分类

2、可以给类添加成员属性,但是是私有变量

3、可以给类添加方法,也是私有方法 (添加的方法一定要实现,Category 中的方法可以不实现)

4、一般情况下,Extension 是放在.m文件的@implementation 的上方

注:Extension 中的方法必须在@implementation中实现,否则会编译出错

分类(Category) 和 类扩展(Extension) 的区别:

Extension:

1、在编译期间决议,是类的一部分,在编译器和头文件的@interface和实现文件里的@implement一起形成一个完整的类

2、伴随着类的产生而产生,也随着类的消失而消失

3、Extension 一般用来隐藏类的私有信息,必须有一个类的源码才能添加一个类的Extension ,所以对于系统的类,是无法添加类扩展

Category:

1、是运行时决议的

2、类扩展可以添加实例变量,分类不能添加实例变量,因为在运行时期间,对象的内存布局已经确定,如果添加实例变量会破坏类的内部布局

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值