【OC】类别与扩展

文章介绍了Objective-C中的类别(Category)和扩展(Extension)的概念和用途。类别允许在不修改原有类源代码的情况下添加新方法,常用于模块化设计和调用私有方法。扩展则用于在类的实现文件中添加私有属性和方法,提供隐藏实现细节的能力。两者都在类的生命周期内添加方法,但扩展在编译时需实现所有声明的方法,而类别则不要求。


前言

我们前面已经学习了继承。现在我们需要在我们已有的类中添加一些新方法,这当然可以用继承的方法,但这显的太过多余,因此我们引出我们的类别与扩展

一、类别(category)

OC的动态特征允许我们使用类别为现有的类添加新方法,且不需要创建子类,不需要访问原有类的源代码。
通过使用类别我们可以动态地为现有的类添加新方法,且将类定义模块化地分布到多个文件中
在这里插入图片描述
这是我们定义的类别文件
在这里插入图片描述
我们给出他的实现部分,因为接口部分过于简单就不给出了
在这里插入图片描述
要注意我们这里的不同在这里插入图片描述
我们是在原有的类上添加新方法
函数部分:
在这里插入图片描述
这样我们就不用创建子类,可以直接为我们的类添加新方法。

二、使用类别对类进行模块化设计

我们通过查看源码可以得知在NSWindow这个类中有很多类别,这就很好地体现了我们类的模块化的思想
在这里插入图片描述

三、使用类别调用私有方法

在这里插入图片描述
我们在前面提到过当我们在类的实现部分定义我们的方法但接口部分没有定义时,我们的函数部分是调用不了我们的方法的
这张图片的意思就是说我们可以在类别中添加我们类实现部分定义的方法来让我们的函数调用这个方法
在这里插入图片描述
不过这里有一点的注意就是我们的类别中其实什么都不用定义,只需要在我们的main函数前面声明我们需要声明的方法即可

四、扩展(extention)

我们用扩展来临时对某个类的接口进行扩展,类实现部分需要同时实现类接口部分的方法和扩展部分的方法。
在这里插入图片描述
函数部分这里要特别注意我们main函数上面的部分
在这里插入图片描述
笔者在前面实现了一个add方法,在上文已经提到过,然后在实现部分定义了一个info方法
在这里插入图片描述
由于我们的类接口部分没有定义这个方法,所以我们需要扩展帮帮主我们定义这个方法。在这里笔者没有导入成员变量,实际上成员变量也是可以在扩展中用@property定义的。

注意:
在这里插入图片描述

总结

1、我们在分类中通常只能定义方法,而不能定义属性,同时当我们创建了一个Category,会出现一个.m和一个.h文件
同时我们的分类的.h中定义的方法一般是在.m文件中实现的,然后将类别引入主函数,我们就可以使用其方法了

.h文件
在这里插入图片描述
.m文件
在这里插入图片描述

2、而对于扩展,它只有一个.h文件,我们既可以声明我们的属性,又可以声明我们的方法,我们在扩展中声明的方法要在我们类的实现部分实现

我们的扩展中既可以添加属性,也可以添加方法,
扩展.h文件
在这里插入图片描述
类实现部分
在这里插入图片描述

总结来说,分类和扩展都是用于扩展已有类的机制,但它们在功能和使用方式上有所区别。分类允许为类添加新的方法,并且方法会被共享和继承,而扩展主要用于在类的实现文件中添加私有的方法和属性,以及隐藏实现细节。

区别与联系:

  • 类别与扩展都可以为原来的类添加新的方法,但是类别的方法不实现系统不会提供警告扩展的方法不提供实现系统会提示警告

原因是分类在运行时就已经添加到类中,扩展在编译的时候阶段被添加到类中

具体解释:
导致类别中方法不提供实现时不会警告的原因是编译器对类别的处理方式,将类别的方法声明合并到原始类的方法列表中,而不检查方法的具体实现。而扩展则要求在声明方法时必须提供实现,编译器可以在编译时检查到缺失的实现并给出警告。

  • 类别不允许添加成员变量和属性,扩展可以

分类(Category):

  • 属性:分类可以添加属性,但底层实现是通过关联对象(Associated Object)来实现的,而不是直接添加实例变量(成员变量)。
  • 成员变量:分类无法直接添加实例变量(成员变量)。
  • 方法:分类可以添加实例方法和类方法的声明和实现。

扩展(Extension):

  • 属性:扩展可以添加属性,可以直接添加实例变量(成员变量)来支持这些属性。
  • 成员变量:扩展可以直接添加实例变量(成员变量)。
  • 方法:扩展可以添加实例方法和类方法的声明和实现。
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值