iOS-分类(Categories)和类扩展(Extensions)

iOS-分类(Categories)和类扩展(Extensions),第1张

扩展可以增加属性和成员变量,一般写在.m里,所以一般为私有的

而分类可以写在.h 或者 .m 里写在.m就变成了私有的方法

分类优先级比原类的优先级较高,如果重写将覆盖原类的方法

如果非要添加属性和成员变量,可以使用runtime来添加 ,必须自己实现set 和 get方法

为类添加额外的方法,

(1) 不一定要在@implementation中实现,但是找不到实现会报错

(2) Category理论上不能添加变量,但是可以使用@dynamic 来弥补这种不足。 (即运行时Runtime)  并手动实现 set get方法

.h

.m

不实现,运行会报错

不实现,直接警告 ,必须在@implementation中实现,

类扩展像是没有命名的类别

定义的变量可以声明在.m里,私有的,也可以声明在.h里就是共有的

方法要在.m里实现

类别和类扩展的区别

1、类别中原则上只能增加方法(能添加属性的的原因通过runtime解决无setter/getter的问题,添加的属性是共有的,本类和子类都能访问);

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

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

4、类扩展不仅可以增加方法,还可以增加实例属性;定义在 .m 文件中的类扩展方法和属性为私有的,定义在 .h 文件(新建扩展文件的。h)中的类扩展方法和属性为公有的。类扩展是在 .m 文件中声明私有方法的非常好的方式。

更多: iOS面试题合集

一、分类(Category):

分类(Category)它是表示一个指向分类的结构体的指针。原则上它只能增加方法,不能增加成员(实例)变量。Category 是表示一个指向分类的结构体的指针。

这个结构体主要包含了分类定义的实例方法与类方法,其中instance_methods 列表是 objc_class 中方法列表的一个子集,而class_methods列表是元类方法列表的一个子集。

但在这个结构体里面,没有属性列表!

二、类扩展(class extension)

Extension是Category的一个特例。类扩展与分类相比只少了分类的名称,所以称之为“匿名分类”。

1、类扩展不仅可以增加方法,还可以增加实例变量(或者属性)

2、类扩展所声明的方法必须依托对应类的实现部分来实现。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/bake/11690936.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存