iOS中分类(category)和类扩展(Extension)的区别

一、分类的定义:
分类是OC中的特有语法,它是表示一个指向分类结构体的指针,它是为了扩展系统类的方法而产生的一种方式。

二、分类的创建
1、首先创建一个项目,然后新建一个Object-C File文件

2、接着到了配置分类信息的界面:因为这里是创建分类,所以选择Categary,Class指的是需要扩展的系统类,file就填写分类的名称。

3、最后就可以创建出一个标准的分类文件了。如图

三、分类的作用:
分类的作用就是在不修改原有类的基础上,为一个类扩展方法,最主要的是可以给系统类扩展我们自己定义的方法。

四、使用分类需要注意的几个点:
1.分类是用于给原有类添加方法的,因为分类的结构体指针中,没有实例变量的成员结构,所以原则上讲他只能添加方法,不能添加属性(成员变量),实际上他是可以通过其他方式来添加属性,比如关联对象(runtime)。但是使用runtime也只能实现setter和getter方法,而没有_成员变量,如果调用_成员变量,程序还是会报错。
2、如果要使用@property来给分类添加成员变量的话,需要手动写变量的setter和getter方法,否则添加的成员变量无法使用。因为在分类中不会生成setter和getter方法,也不会生成以及实现私有的成员变量。
3、可以在分类中访问原有类.h中声明的属性。
4、如果分类中有和原有类同名的方法,会优先调用分类中的方法,就是说会忽略原有类的方法。所以同名方法调用的优先级为:分类>本类>父类。
5、如果多个分类中都有和原有类同名的方法,那么调用该用法的时候执行谁由编译器决定,编译器会执行最后一个参与编译的分类中的方法。

五、类扩展(Extention):
是Categary的一个特例。类扩展与分类相比只少了分类的名称,所以称之为“匿名分类”。(比如从xib文件中拖拽出来在.m文件中显示的属性和方法就是类扩展)

六、类扩展的创建
1、首先创建一个项目,然后新建一个Object-C File文件。
2、因为这里是创建类扩展,所以选择Extension,Class指的是需要扩展的系统类,file就填写要扩展的名称。

3、创建出来的类扩展文件:

七、类扩展的作用:
1、为一个类附加额外属性、变量、方法和声明。
2、一般的类扩展写到宿主类的.m文件中.
3、一般的私有属性写到类扩展中。

八、类别与类扩展的区别:
1、类别原则上只能添加方法而不能添加属性(能添加属性的原因只是通过runtime解决无setter/getter方法的问题而已,如果调用_成员变量,程序还是会报错)。
2、类扩展不仅可以增加方法,还可以增加实例变量(或者属性),只是该变量默认是@private类型的。(所以作用范围只能在自身类,而不是子类或者其它地方)
3、类扩展中声明的方法没被实现,编译器会报警,但是类别中的方法没被实现编译器是不会有任何警告的,这是因为类扩展是在编译阶段被添加到类中,而分类是在运行时添加到类中。
4、类扩展不能像类别那样拥有独立的实现部分(@implementation部分),和本类共享一个实现。也就是说,类扩展所声明的方法必须依托对应宿主类的实现部分来实现。

iOS之Category和Extention的区别相关推荐

  1. iOS学习笔记2(结合项目)--Category和Extension的区别

    在实际项目中,用到Category比较多,Category也很实用,我们可以把一些经常用到或者很通用的功能封装到一个Category里,当其他项目需要相同的功能时,我们可以直接拿来用,不用从零开始写, ...

  2. category和extension的区别

    category和extension的区别 就category和extension的区别来看,我们可以推导出一个明显的事实,extension可以添加实例变量,而category是无法添加实例变量的( ...

  3. 楚留香手游系统互通的服务器,楚留香安卓和ios版数据互通吗 如何区别楚留香官方渠道...

    昨日网易手游<楚留香>正式开启公测,但是楚留香安卓和ios版数据互通吗?如何区别楚留香官方渠道? 楚留香安卓和ios版数据互通吗? 网易官方渠道中,IOS和安卓是互通的,其他渠道服务器就不 ...

  4. iOS Category 和 Extention 的本质区别【面试必备】

    感谢这位博主的博客:由category为什么不能添加属性所想到的 为什么category 不能添加属性,而Extention能添加? 这个问题从几个方面来解释下: 什么是OC中的属性? 属性,是某个对 ...

  5. iOS开发中各种关键字的区别

    1.一些概念 1.浅Copy:指针的复制,只是多了一个指向这块内存的指针,共用一块内存. 深Copy:内存的复制,两块内存是完全不同的, 也就是两个对象指针分别指向不同的内存,互不干涉. 2.atom ...

  6. OC中protocol、category和继承的区别

    利用继承,多态是一个很好的保持"对扩展开放.对更改封闭"(OCP)的办法,也是最常见的一种方法.Objective C还支持另外两种语法来支持OCP:Protocol和Catego ...

  7. SAP中类型(Type)和类别(Category)详解及其区别

    文章目录 一.概述 二.系统示例1-订单 三.系统示例2-凭证 一.概述 类型(Type)和类别(Category)是SAP常见的两个概念,大部分情况下都是一起出现. 如:SD凭证类型和SD凭证类别. ...

  8. Android与iOS在交互细节上的区别(转)

    以下内容来自知乎,作者@MoonMonster,百度无线用户体验部交互设计师,上海MUX负责人. 本文通过了解iOS&Android这两个基本制霸移动平台的智能手机系统的交互区别(深坑),让从 ...

  9. iOS 开发_..和self...的区别以及使用

    相信很多初学者对_和self.之间的区别并没有一个大致的认识,那么下面对两者的区别做一个简单的介绍: 至于重写set和get方法,简要说明一下,当我们使用@property这用法之后,系统便会自动给我 ...

最新文章

  1. 【百度地图API】北京周边7日游——图标按路线轨迹行动
  2. 在MAC下安装redis以及其PHP扩展
  3. 王咏刚分享DeeCamp三年成功经验:学生超自主,导师很顶尖,批量培养AI人才不是梦...
  4. hdu 2516 FIB博弈模型
  5. from torch._C import * ImportError: DLL load failed: 找不到指定的模块。
  6. 【C语言】【笔试题】模拟实现memcmp
  7. 在Linux PC上查看arm交叉编译的可执行文件依赖的动态库
  8. OpenGL编程指南1:OpenGL简介
  9. C++ STL简介(转)
  10. Mac上Java开发环境配置
  11. ASP.NET 2.0 – 如何巢状化GridView控件 (转自章立民CnBlogs)
  12. Evernote 全球开发者大赛最终入围作品介绍
  13. 梨花众创 - 微信支付宝收款二维码合并器
  14. 一网打尽位图与矢量图
  15. Mac 上有哪些值得推荐的软件?冷门小众软件但实用
  16. SVN 下载与安装(超简单)!!!
  17. badboy无法录制 浏览器版本过低请下载最新的Badboy
  18. 一根网线实现双机互联共享文件
  19. sencha list
  20. 物理-光学仪器-三菱镜:三菱镜 百科

热门文章

  1. 三、Android网络开发
  2. 笔记本重装系统后office没了
  3. CSS 样式书写顺序及规范
  4. 3.100个渗透测试实战#3(Lampiao)
  5. PPT动画制作飘落的树叶免费ppt模板
  6. [NGUI]NGUI中的九宫格切图模式
  7. 微信怎样操作开启微信运动?技巧经验!微信中如何去设置微信运动记录运动步数?
  8. BAT公司职级体系及薪水解密
  9. win10以太网dns服务器未响应,Win10系统dns服务器未响应如何修复?
  10. 在keil 4中添加stc系列芯片的方法--【sky原创】