美文网首页
2021-04-22

2021-04-22

作者: 是超超呀 | 来源:发表于2021-04-22 16:41 被阅读0次

    类别 扩展 继承

    继承:一个类(子类)继承于另一个类(父类),那么子类不仅拥有父类所有的属性和方法,而且可以创建属于自己的属性和方法。

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

    分类(category): 只能添加方法,不能添加属性,因为分类中的可以写@property, 但不会生成setter/getter方法, 也不会生成实现以及私有的成员变量(编译时会报警告)。

    可以在分类中访问原有类.h中的属性,分类是给原有类添加方法的,在分类的结构体指针中,没有属性列表,只有方法列表,原则上不能添加属性,实际上可以通过其他方式添加(通过runtime解决没有setter/getter的问题)。

    如果分类中有和原有类同名的方法, 会优先调用分类中的方法, 就是说会忽略原有类的方法。所以同名方法调用的优先级为 分类 > 本类 > 父类

    扩展和分类区别:

    extension在编译期决议,它就是类的一部分,在编译期和头文件里的@interface以及实现文件里的@implement一起形成一个完整的类,它伴随类的产生而产生,亦随之一起消亡

    category则完全不一样,它是在运行期决议的。 就category和extension的区别来看,extension可以添加实例变量,而category是无法添加实例变量的(因为在运行期,对象的内存布局已经确定,如果添加实例变量就会破坏类的内部布局,这对编译型语言来说是灾难性的)。

    类扩展不能像分类那样拥有独立的实现部分 @implementaton 部分。也就是说,类扩展所声明的方法必须依托对应的类的实现部分来实现。

    相关文章

      网友评论

          本文标题:2021-04-22

          本文链接:https://www.haomeiwen.com/subject/tscfrltx.html