转载:

http://www.cocoachina.com/bbs/read.php?tid=235729

http://www.cocoachina.com/ios/20170406/19001.html

Category , Extension

1. Category

利用Objective-C的动态运行时分配机制,Category提供了一种比继承更为简洁的方法来对class进行扩展,无需创建对象类的子类就能为现有的类添加新方法,可以为任何已经存在的class添加方法,包括那些没有源代码的类。

(1)无法向类中添加新的实例变量,类别没有位置容纳实例变量。

(2)名称冲突,即当类别中的方法与原始类方法名称冲突时,类别具有更高的优先级。类别方法将完全取代初始方法从而无法再使用初始方法。

@interface NSString (CategoryDemo)

@end

@implementation NSString (CategoryDemo)

@end

下面资源不错哦:

Objective-C相关Category的收集

需要注意的有两点:

1)、category的方法没有“完全替换掉”原来类已经有的方法,也就是说如果category和原来类都有methodA,那么category附加完成之后,类的方法列表里会有两个methodA。

2)、category的方法被放到了新方法列表的前面,而原来类的方法被放到了新方法列表的后面,这也就是我们平常所说的category的方法会“覆盖”掉原来类的同名方法,这是因为运行时在查找方法的时候是顺着方法列表的顺序查找的,它只要一找到对应名字的方法,就会罢休,殊不知后面可能还有一样名字的方法。

2. Extension

匿名的Category。类有时需要一些只为自己所见、所用的私有方法,这种私有方法可以通过延展的方式来声明,定义的方法在类本身的@implementation代码区域中进行实现。

category是拥有.h文件和.m文件的东西。但是extension不然。extension只存在于一个.h文件中,或者extension只能寄生于一个类的.m文件中。比如,viewController.m文件中通常寄生这么个东西,其实这就是一个extension:

与Category不同的地方:可增加私有属性,声明的方法必须实现。

@interface A

@end

@interface A (Setter)

- (void)setNumber:(NSNumber *)newNumber;

@end

@implementation A

- (void)setNumber:(NSNumber *)newNumber

{

//do something

}

@end

3.category和extension的区别

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

  • extension在编译期决议,它就是类的一部分,但是category则完全不一样,它是在运行期决议的。extension在编译期和头文件里的@interface以及实现文件里的@implement一起形成一个完整的类,它、extension伴随类的产生而产生,亦随之一起消亡。
  • extension一般用来隐藏类的私有信息,你必须有一个类的源码才能为一个类添加extension,所以你无法为系统的类比如NSString添加extension,除非创建子类再添加extension。而category不需要有类的源码,我们可以给系统提供的类添加category。
  • extension可以添加实例变量,而category不可以。
  • extension和category都可以添加属性,但是category的属性不能生成成员变量和getter、setter方法的实现。

4.注意

1.注意:category是在运行时加载的,不是在编译时。

2.extension常用的形式并不是以一个单独的.h文件存在,而是寄生在类的.m文件中。

(0071)iOS开发之Category VS Extension区别理解相关推荐

  1. iOS开发之Xcode常用调试技巧总结

    转载自:iOS开发之Xcode常用调试技巧总结 最近在面试,面试过程中问到了一些Xcode常用的调试技巧问题.平常开发过程中用的还挺顺手的,但你要突然让我说,确实一脸懵逼.Debug的技巧很多,比如最 ...

  2. iOS开发之Objective-C(基础篇)-李飞-专题视频课程

    iOS开发之Objective-C(基础篇)-232人已学习 课程介绍         该系列课程是iOS开发之Objective-C基础入门视频.课程中会详细的讲解OC语法特点,面向对象的使用,循环 ...

  3. iOS开发之c语言入门教程

    苹果作为移动互联的高端品牌,iOS操作系统也被用户公认为是最好用的移动互联网操作系统.据了解,曾一度拒绝为iOS平台对出浏览器的火狐在今年5月份的时候,他们却食言了.今天,Mozilla宣布iOS版F ...

  4. iOS开发之AVKit框架使用

    2019独角兽企业重金招聘Python工程师标准>>> iOS开发之AVKit框架使用 一.引言 在iOS开发框架中,AVKit是一个非常上层,偏应用的框架,它是基于AVFounda ...

  5. (0045) iOS 开发之MBProgressHUD 源码学习

    (0045) iOS 开发之MBProgressHUD 源码学习 第一部分:学习所得和分析线程 1.  学习到了kvo 的使用 和屏幕方向的旋转判断. 2. 如果调起这个 HUD 的方法不是在主线程调 ...

  6. (0016)iOS 开发之Mac上Navicat Premium 创建远程连接和本地连接

    1.下载安装 (百度云盘里面有安装文件和注册机) 链接: https://pan.baidu.com/s/1kVG1k71 密码: mr5g 破解教程看这篇博客:http://blog.csdn.ne ...

  7. 李洪强iOS开发之RunLoop的原理和核心机制

    李洪强iOS开发之RunLoop的原理和核心机制 搞iOS之后一直没有深入研究过RunLoop,非常的惭愧.刚好前一阵子负责性能优化项目,需要利用RunLoop做性能优化和性能检测,趁着这个机会深入研 ...

  8. IOS开发之MD5加密和钥匙串的使用-oc

    IOS开发之MD5加密和钥匙串的使用-oc 源码在我的主页,md5加密是用户登录安全的一个保障.不可逆的,可以暴力破解的. // // ViewController.m // MD5演练 // // ...

  9. IOS开发之CALayer基本属性和使用

    IOS开发之CALayer基本属性和使用 // // ViewController.m // CALayer // // Created by 鲁军 on 2021/2/21. //#import & ...

最新文章

  1. EnterLib PIAB又一个BUG?
  2. 期待已久的2012年度最佳 jQuery 插件揭晓
  3. JZOJ 5637. 【NOI2018模拟4.8】一双木棋
  4. 数据结构与算法 / B- Tree 和 B+ Tree
  5. boos::reverse_iterator相关的测试程序
  6. SpringBoot2.0 整合 SpringSecurity 框架,实现用户权限安全管理
  7. 第二篇:对CART,Gradient Boost,Xgboost,LightGBM的学习
  8. 干货警告!476个PyTorch资源大合集推荐,GitHub超过3600星
  9. C++11 委托构造函数
  10. JavaScript HTML DOM 1
  11. ROS学习:智能车室外光电组仿真
  12. 【java笔记】map集合
  13. Python socket粘包解决
  14. Martin Fowler谈微服务的优缺点
  15. 浅谈估值模型:相对估值模型中的变形金刚——PE指标I
  16. Python | 单词搜索(educoder)
  17. whisper ASR体验
  18. 赏析角度有哪些_从“视听语言”角度,主要从哪些方面进行影视赏析(? ?)。...
  19. VTA(Versatile Tensor Accelerator)阅读笔记
  20. python open 函数漏洞_python和django的目录遍历漏洞

热门文章

  1. 「北京」「10-30k」「华米科技(小米手环)」招前端工程师
  2. OpenStack(Kilo版本)基础架构学习笔记
  3. N个免费DevOps开源工具,没用过,至少应该了解!
  4. Linux 学习记录 四(Bash 和 Shell scirpt).
  5. react-router的基础知识
  6. JDBC连接SQLserver2008,使用jdk为1.7 [个人新浪微博]
  7. Xendesktop 可基于物理机及虚拟机的桌面控制交付
  8. 偷懒日志 - 自动生成代码 - 第二步 生成POJO
  9. JavaWeb——多个Filter代码的执行顺序
  10. 泛域名Wildcard Domain