category和extension

本文深入探讨了iOS开发中Category与Extension的区别,包括它们在编译期与运行期的决议方式,Category仅能添加只读属性,而Extension则允许添加实例变量。此外,文章还阐述了如何在原始类上增加不公开的方法与属性时选择使用Extension,以及在封装公共方法时考虑使用Category。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


http://tech.meituan.com/DiveIntoCategory.html

2、连类比事-category和extension

extension看起来很像一个匿名的category,但是extension和有名字的category几乎完全是两个东西。 extension在编译期决议,它就是类的一部分,在编译期和头文件里的@interface以及实现文件里的@implement一起形成一个完整的类,它伴随类的产生而产生,亦随之一起消亡。extension一般用来隐藏类的私有信息,你必须有一个类的源码才能为一个类添加extension,所以你无法为系统的类比如NSString添加extension。(详见2

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




iOS学习笔记:Category与Extension的区别

前言

作为一个有4年以上iOS开发经验的开者者来说,使用Category和Extension的场景应该是数不胜数的,也不知道从XCode的哪个版本开始,创建一个新的UIViewController类会默认添加一个该类的Extension,而我也习惯于在这个Extension上添加一些不公开的属性。

我的分析

仔细查阅了相关资料并且结合自己的实践得出以下结论:

Category: 字面意思是类别。

  • 主要用来扩展方法,并且适用于subclass;
  • 只能添加readonly的属性, 如果要添加readwrite属性必须在runtime过程中用objc_setAssociatedObject()和objc_getAssociatedObject()方法来实现属性的get与set方法;

Extension:字面意思是扩展。

  • 同样可以扩展方法和属性,但局限于原始类;
  • 声明的方法必须在@implemention中实现,不然编译器会报warning;
    在extension中可以定义可写的属性,公有可读、私有可写的属性(Publicly-Readable, Privately-Writeable Properties)一般这样实现。

    总结

    综上所述,我们通常要封装一些公共方法的时候我们可以考虑使用Category的方式。
    如果我们想在原始类上面增加一些不公开的方法、属性(私有方法、属性)时可以新建一个Extension来解决问题。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值