开发应用

一、分类(category)&类扩展(Extension)的区别

2022-04-29  本文已影响0人  流小贝

1、分类定义 (category)

分类是oc中的特有语法,它表示一个指向分类结构体的指针,它是为了扩展系统类的方法而产生的一种方式。

2、分类的作用:

分类的作用就是在不修改原有类的基础上,为一个类扩展方法,最主要的是可以给系统类扩展我们自己定义的方法。

3、分类需要注意的几个点:

   1)、分类是用于给原有类添加方法的,因为分类的结构指针中,没有属性列表,所以原则上讲它只能添加方法,不能添加属性(即成员变量),实际上它也可以通过其他方法来添加属性,比如runtime。但使用runtime也只能实现setter、getter方法,并没有成员变量,如果调用成员变量,程序还是会出错。

   2)、如果要使用 property 来给分类添加成员变量的话,则需要实现它的变量的getter/setter方法,不然添加的成员变量无法使用,因为在分类中不会生成相应的getter/setter方法,也不会生成以及实现私有的成员变量。

   3)、在分类中可以访问原有类的.h文件暴露的属性。

   4)、如果多个分类中都有和原有类同名的方法,会优先调用分类中的方法,而忽略原有类的方法,故同名方法调用的顺序为:分类 > 本类 > 父类。

   5)、同时多个分类中都有相同的方法,那么调用该方法时执行谁将由编译器决定,编译器会执行最后一个参与编译的分类中的方法。

4、类扩展的作用(Extension):

   1)、为一个类附加额外的属性、变量、方法和声明。

   2)、一般的类扩展写在原有类的.m文件中。

   3)、一般私有属性写在类扩展中。

5、分类与类扩展的区别:

   1)、分类原则上只能添加方法不能添加属性。

   2)、类扩展不仅可以添加方法,还可以增加实例变量(或属性),只不过该变量默认是私有的(private)。--即作用范围只能在自身类,而不是子类或其它地方。

   3)、类扩展中申明的方法没有被实现,编译器会报警,但在分类中的方法没有被实现编译器是不会有任何的警告的,这是因为类扩展是在编译阶段被添加到类中,而分类则是在运行时添加到类中的。

   4)、类扩展不能像类别那样拥有独立的实现部分(@implementation部分),即类扩展中声明的方法必须依托对应类的实现部分来实现相应的方法功能。

分类:在不修改一个类的情况下给类增加方法,即在不知道.m的情况下只能增加方法,但不能增加成员变量,可以添加属性,但是只会生成set和get方法的声明,不会生成成员变量,要想保存变量可以通过动态绑定的方式,同一个方法,在分类中的方法执行优先级高,同一个方法只执行一次。

分类原理:原理是讲分类中的中方法、属性、协议放在category结构体里面,然后在运行时拷到对象的结构体中,但是对象的成员变量是在编译时已经分配好内存,分类在运行时加入变量会破坏对象的内存布局,因此不能在运行时添加变量,对象关联的KV对保存在一个全局的哈希表里面,当对象销毁时会释放所有关联的KV对。

类扩展:类扩展有点像匿名的分类,但是它和分类是两个完全不同的东西,因为在.m中给类扩展私有的成员变量或者属性,可以扩展变量和方法,因此必须知道类的.m文件才能给类添加扩展。

类扩展原理:类扩展是在编译期内存就决定好了,是类的一部分。

分类

1、原则上只能增加方法(能添加属性的的原因只是通过runtime的objc_setAssociatedObject和objc_getAssociatedObject方法添加setter/getter方法);

2、方法没被实现编译器不会有任何警告,因为分类是在运行时添加到类中;

3、可以减少单个文件的体积;

4、把不同功能组织到不同的Category里;

5、可以由多个开发者共同完成一个类;

6、可以按需加载想要的category;

7、声明私有方法;

缺点

(1)、无法向类中添加新的实例变量;

(2)、名称冲突,即当类别中的方法与原始类方法名称冲突时,类别具有更高的优先级;

(3)、如果多个分类中都有和原有类中同名的方法, 那么调用该方法的时候执行谁由编译器决定,编译器会执行最后一个参与编译的分类中的方法。

类扩展

1、不仅可以增加方法,还可以增加实例变量(或者属性),只是该实例变量默认是@private类型的(使用范围只能在自身类,而不是子类或其他地方);

2、声明的方法没被实现,编译器会报警,因为扩展是在编译阶段被添加到类中;

3、定义在 .m 文件中的扩展方法为私有的,定义在 .h 文件(头文件)中的扩展方法为公有的。扩展是在 .m 文件中声明私有方法的非常好的方式。

缺点

(1)、必须有类的源码才可以给类添加extension,所以对于系统一些类,如nsstring,就无法添加类扩展

分类(category)和类扩展(extension)的关系

1.类扩展(extension)是category的一个特例,有时候也被称为匿名分类或者私有类。他的作用是为一个类添加一些私有的成员变量和方法。

2.类扩展能写点啥?和分类不同,类扩展即可以声明成员变量又可以声明方法。

3.类扩展听上去很复杂,但其实我们很早就认识他了。你记得继承自UIViewController的ViewController和继承自NSObject的类有什么不同么?

4.类扩展可以定义在.m文件中,这种扩展方式中定义的变量都是私有的,也可以定义在.h文件中,这样定义的代码就是共有的,类扩展在.m文件中声明私有方法是非常好的方式。

5.类扩展中添加的新方法,一定要实现。categorygory中没有这种限制。

上一篇 下一篇

猜你喜欢

热点阅读