一入门篇
1 什么是category?ios
category能够用于为已有的类添加方法(只能添加方法不能添加属性)有点相似于继承,除此以外,apple还推荐了category的另外两个使用场景: **1.把类的实现分步在多个文件中,精简了单个文件的体积把类的实现按照功能分布在不一样的文件中,同时也助于团队的开发,也能够按需加载所需的category。** **2.声明私有方法 (若是不在接口中声明方法而只是在实现文件中直接实现一个方法用于完成在头文件中所给出的公共接口编译时会有警告,那么能够在.m文件的开头定义一个category并添加相应的方法从而消除编译的警告)** **3.模拟多继承** **4.framework私有方法公开** **5.用于非正式协议(典型的例子是代理ios那些自带的代理几乎都是NSObject的类别,因此任何一个OC对象均可以成为代理,NSObject是OC对象的父类)**
2 category和extension的区别app
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