分类(category)和扩展(extension)

一、分类(category):

1.1 概念:

分类是OC中特有的语法,他标识一个指向分类的结构体的指针。使用分类可以在不进行子类化的情况下,为已经存在的类增加功能。原则上它只能增加方法,不能增加成员变量。

1.2 作用:

(1) 扩展替他人定义的类(即使你无法访问它们的源代码);
(2) 代替子类
(3) 将新类的实现代码分发给多个源文件

注意:

  1. 分类中添加“方法”,不能增加成员变量,因为分类的结构体指针中,没有属性列表,只有方法列表;
    如果分类中声明了一个属性,那么,那么分类指挥生成这个属性的set、get方法声明,不会有实现(调用set方法给属性赋值,调用get方法获取属性值都会崩溃)
    原则上分类只能添加方法,不能添加属性即成员变量,实际上可以通过getter、setter(即运行时)添加属性
  2. 分类中可以写@property,但不会生成setter/getter方法,也不会生成实现以及是有的成员变量;
  3. 分类中可以访问原来类中的成员变量,但是只能访问@protect@public形式的变量。如果想要访问本类中的私有变量,分类和子类一样,只能通过方法来访问;
  4. 如果分类中有和原有类同名的方法,会优先调用分类中的方法, 就是说会忽略原有类的方法。所以同名方法调用的优先级为分类 > 本类 > 父类。
  5. 如果多个分类中都有和原有类中同名的方法, 那么调用该方法的时候执行谁由编译器决定;编译器会执行最后一个参与编译的分类中的方法。

1.3 通过运行时添加属性

由于OC是动态语言,方法真正的实现是通过runtime完成的,虽然系统不给我们生成setter/getter,但我们可以通过runtime手动添加setter/getter方法。

#import <objc/runtime.h>

static NSString *nameWithSetterGetterKey = @"nameWithSetterGetterKey";//定义一个key值

@implementation Programmer (Category) 

//运行时实现setter方法
- (void)setNameWithSetterGetter:(NSString*)nameWithSetterGetter
{
    objc_setAssociatedObject(self, &nameWithSetterGetterKey, nameWithSetterGetter, OBJC_ASSOCIATION_COPY);
}

//运行时实现getter方法
- (NSString*)nameWithSetterGetter
{
    return objc_getAssociatedObject(self, &nameWithSetterGetterKey);
}
@end

注意:
以上代码仅仅是手动实现了setter/getter方法,但调用_成员变量依然报错。

二、扩展

2.1 概念

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

2.2 作用

(1) 能为某个类附加额外的属性,成员变量,方法声明;
(2) 一般的类扩展写到.m文件中;
(3) 一般的私有属性写到类扩展,外界不能访问;

三、继承

3.1 概念

继承是指一个新类拥有被继承类(父类)的全部属性和方法。子类与父类耦合度很高。当子类中需要有自己独特的行为,不想使用父类的方法,可以把父类的方法覆盖掉:直接在子类中用一样的名字写个方法。不用在.h中写,因为父类已经声明过了,直接在.m中重写。

3.2 作用

OC是单继承:一个类只能继承一个直接父类;
继承的好处:代码重用;
继承的缺点:父类的改变影响所有的子类。

四、category、extension和inheritance的区别

分类(category)延展(extension)继承(inheritance)
功能为类添加方法,不用知道类的源码,添加变量(通过运行时)为类添加私有变量和私有方法,在类的源文件中书写,所以知道类的源代码即能为类添加方法又能添加变量
特点添加的方法称为类的一部分,可以被子类继承添加的变量和方法只有这个类内部访问,正常情况下外边不能访问(可以通过运行时),不能被子类继承新添加的变量和方法只能子类才能具有,父类不具有
使用使用原始类的对象(调用-方法)或者类(调用+方法)调用方法在类内部(源文件)使用只能子类使用
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: iOS的extensioncategory都可以用来扩展现有的类或框架的功能,但它们有着不同的应用场景和功能。 Extension是一种特殊的类别,可以在不同的应用程序之间共享代码和资源。它可以让你在一个应用程序中使用另一个应用程序中定义的代码,以及在应用程序之间共享数据。它还可以用于创建自定义的键盘、分享扩展和Today Widget等功能。 而Category则是扩展现有类的一种方式。使用Category可以向现有类中添加新的方法,而不必修改原来的类。这在一些第三方框架的使用中很常见,例如向UIKit中的现有类添加新的方法以增强其功能。 总的来说,Extension是用于扩展应用程序之间的共享代码和资源,而Category是用于扩展现有类的功能。 ### 回答2: iOS中的extensioncategory都是为了给已有的类添加额外的功能或行为。然而,它们之间存在着一些区别。 首先,extension是在编译时期进行的,而category是在运行时期进行的。这意味着extension可以添加实例变量和属性,以及重写已有的方法,而category只能添加方法,不能添加实例变量和属性。 其次,extension可以在类的定义中直接使用,而不需要导入其他文件。这使得extension更适合用于类的内部实现和私有方法。而category需要通过#import导入相关的头文件,才能在其他地方使用它添加的方法。 另外,extension中的方法默认是对所有该类的实例起作用的,而category中的方法可以选择是对所有实例起作用,还是只对指定的实例起作用。这使得category更适合为特定实例或者特定场景添加方法。 此外,extension可以添加协议的遵循,并且可以为协议提供默认实现。而category无法添加协议的遵循,只能通过extension来实现。 总的来说,extension更适合于对类的内部实现进行扩展和增强,而category更适合为类的公共接口添加方法。不同的情况下,可以根据具体的需求选择使用extension还是category来进行功能扩展。 ### 回答3: iOS中的 extension扩展)和 category类别)都是用来扩展现有类的能力,但它们在实现方式和适用范围上有一些区别。 1. 扩展extension)是一种在现有类中添加新功能和属性的方式。通过 extension,我们可以在不改变原始类定义的情况下,向已有类添加新的方法、计算属性、下标脚本、构造函数等。扩展可以用于自定义类、结构体和枚举。扩展不能添加存储属性,只能添加计算属性。扩展在编译时添加新功能,且是对整个类进行扩展,对所有已有对象都起作用。 2. 类别category)是一种为已有类添加方法的方式,主要用于为现有类添加特定功能或模块。通过类别,我们可以将类的实现分散到多个文件中,方便代码的管理和复用。类别只能添加方法,不能添加属性和成员变量。类别在运行时动态加载,需要注意的是,类别只能为自定义类和框架类添加方法,不能为系统类添加方法。 总的来说,扩展更加灵活,可以在编译时为类添加新的功能和属性,并且适用于自定义类、结构体和枚举;而类别主要用于将类的实现分散到多个文件中,并为已有类添加方法的功能扩展,适用于自定义类和框架类。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值