最近发现面试题总是会出现说下Category和Extension的区别
之前学习的时候总是分不清 ,随着自己写的代码看的代码多了,规律也变的清楚了,借此在Xcode8上大致写下。
1.1categories
一 、分类(categories)能够向一个已有的类中添加方法。拓展(extensions)能够在当前类中增加属性和方法。
二、类别的局限性
有两方面局限性:
(1)无法向类中添加新的实例变量,类别没有位置容纳实例变量。
(2)名称冲突,即当类别中的方法与原始类方法名称冲突时,类别具有更高的优先级。类别方法将完全取代初始方法从而无法再使用初始方法。
三、类别的作用
类别主要有3个作用:
(1)可以将类的实现分散到多个不同文件或多个不同框架中,方便代码管理。也可以对框架提供类的扩展(没有源码,不能修改)。
(2)创建对私有方法的前向引用:如果其他类中的方法未实现,在你访问其他类的私有方法时编译器报错这时使用类别,在类别中声明这些方法(不必提供方法实现),编译器就不会再产生警告
(3)向对象添加非正式协议:创建一个NSObject的类别称为“创建一个非正式协议”,因为可以作为任何类的委托对象使用。
1.新建项目Categories和Extensions command+n 选择Ojective—C File
2.填写类目名 选择Category
Categories可以为一个对象添加方法而不需要增加该类的子类或者更改当前的对象。实际上Categories通常被用来为已经存在的类添加方法,比如你可以自己为 NSString 字符串类添加你自己的方法。
3.
2.1 类扩展(Extension)简介
类扩展是分类的一个特例。
Extension是Category的一个特例。
起名字为匿名,并且添加的方法一定要实现。(category可以不实现)。因此又叫匿名分类。可以为一个类添加额外的变量,方法或者合成属性。
我的理解:
延展就是为类一开始设计没有考虑到的情况增加新的属性方法来弥补。延展的实现如下:
2.0.1创建 command+n Objective-C 填写延展名Strong 选择
2.0.2 在Person_Strong 里面可以定义属性和 方法
他们的主要区别是:
1、形式上来看,extension是匿名的category。
2、extension里声明的方法需要在mainimplementation中实现,category不强制要求。
3、extension可以添加属性(变量),category不可以。
顶