一入门篇
1 什么是category?

category可以用于为已有的类添加方法(只能添加方法不能添加属性)有点类似于继承,除此之外,apple还推荐了category的另外两个使用场景:

**1.把类的实现分步在多个文件中,精简了单个文件的体积把类的实现按照功能分布在不同的文件中,同时也助于团队的开发,也可以按需加载所需的category。**
**2.声明私有方法 (如果不在接口中声明方法而只是在实现文件中直接实现一个方法用于完成在头文件中所给出的公共接口编译时会有警告,那么可以在.m文件的开头定义一个category并添加相应的方法从而消除编译的警告)**
**3.模拟多继承**
**4.framework私有方法公开**
**5.用于非正式协议(典型的例子是代理ios那些自带的代理几乎都是NSObject的类别,所以任何一个OC对象都可以成为代理,NSObject是OC对象的父类)**

2 category和extension的区别

extension在编译期间起作用,而category是在运行时动态添加的,所以category可以给(一般也是只给)未知源码的类(NSString)添加方法,而extension只能用于自己定义(即源码已知的)类添加方法。另外extension可以给类添加实例变量,但category无法添加实例变量。应为在运行期间对象的内存布局已经确定,如果添加实例变量就会破坏类的内存布局,这对编译型语言是灾难性的

3.category的底层面目
所有的OC类和对象,在runtime层都是用struct实现的category对应category_t

typedef  struct category_t{
    const cahr*name;//类的名字
    classref_ cls;//类
    struct method_list_t* instanceMethods;//category中所有给类添加的实例方法的列表
    Struct method_list_t*classMethod;//category中所有添加的类方法列表
    Struct protocal_list_t *protocals;//category实现所有协议的列表
    Struct property_list_t*instanceProperties;//category中添加的所有属性
    }category_t
4.实现一个category
MyClass.h
#import<Foundation/Foundation.h>
@interface Myclass:NSObject
-(void)printName;
@end
@interface Myclass(MyAddtion)
@property(notamic ,copy)NSString *name;(这不是一个实例变量,只是一个属性,等效于设置了一个get和set方法)
-(void)printName;
@end

Angrypill
84 声望0 粉丝

引用和评论

0 条评论