详解category和extension

1.分类的使用场景?分类和扩展有什么区别?可以分别用来做什么?分类有哪些局限性?分类的结构体里面有哪些成员?
使用场景:
1.可以将类的实现分开在几个不同的文件里。(好处:减少每个文件的体积;可以把不同不同的功能放在不同的category里;可以由多个开发者开发同一个类;可以按需加载category)。
2.声明私有方法。
3.模拟多继承。
4.可以将framework的私有方法公开。

区别:
分类:主要作用是为已经存在的类添加方法。它是在运行期决议的。
扩展:它是类的一部分,是在编译期决议的,在编译期和头文件里的@interface和实现文件里的@implement共同组成一个完整的类,因此,它伴随着类的产生而产生,亦随之一起消亡。一般用来隐藏类的私有信息。

作用:
分类:主要是为已经存在的类添加方法。无法添加实例变量。因为在运行期,对象的内存布局已经确定,如果添加实例变量,就会破坏对象原有的内存布局,这对编译型语言来说是灾难性的。
注意:分类是可以添加属性的,只不过不会生成属性的settergetter方法。所以尽管添加类属性,也无法使用点语法调用settergetter方法。不过我们可以使用运行时关联对象来实现。
扩展:一般用来隐藏类的私有信息,可以添加一些私有的实例变量和方法。

分类的局限性:就是无法添加实例变量,不过我们可以使用runtime的关联对象的方法objc_getAssociatedObjectobjc_setAssociatedObject实现属性的setter和getter方法。

下面我们看一下分类的结构体:

typedef  struct _category_t {
    const char *name;
    struct _class_t *cls;
    const struct _method_list_t *instance_methods;
    const struct _method_list_t *class_methods;
    const struct _protocol_list_t *protocols;
    const struct _prop_list_t *properties;
} category_t;

name:类的名字。
cls:类。
instance_methods:category中给类添加的所有实例方法列表。
class_methods:category中给类添加的所有类方法列表。
protocols:category中所有实现的协议列表。
properties:category中的属性。

从category的定义我们可以看到:category可以添加实例方法,类方法,实现协议,添加属性,但是不能够添加实例变量。
具体内容,可以看这边文章

你可能感兴趣的:(详解category和extension)