iOS - Category 和Extension的区别

简介: iOS - Category 和Extension的区别

iOS Category


Category在iOS开发中使用非常的频繁,特别是在为系统类进行拓展的时候,我们可以不用继承系统类,直接给系统类添加方法,最大程度的体现了Objective-C的动态语言特性。

#import 
@interface NSObject (Category)
- (void)myMethod;
@end


Category的注意点


  • Category的小括号内一定要有名字;故Class Extension亦被称之为匿名分类;

@interface AppDelegate (Share)
/// 注册ShareSdk
- (void)registerShareSdk;
@end


  • Category的方法不一定非要在@implement中实现,也可以在其他位置中实现,但是当调用Category的方法时,依据继承树没有找到该方法的实现,程序则会崩溃;并且,Category的方法优先级较高,可以覆盖原类的方法;


  • Category的方法中,不可以调用super方法;


  • 在实际开发中要注意的是,Category 方法可能会覆盖于同一个类class 的其它 category 中的方法。但也可能被覆盖,因为不法预知他们的加载优先顺序,出现这种情况通常会在编译时出错。如果在一个开发的SDK中使用了类别, 就最好保证类别名不同于使用者的类别名以及类别方法也不同于使用者的类别方法名, 通常通过加前缀来做到。


  • Category理论上不能添加成员变量,但是可以使用@dynamic(即运行时Runtime)来弥补这种不足.


使用Category(类别/分类)


  • 对框架提供类的扩展(没有源码,不能修改)


  • 不想生成一个新的子类的情况下,例如对NSArry的扩展


  • 方便做项目管理,可以将一份源码在多个地方共享或者做方法版本管理、多人协作开发、用本地版本替换公共版本实现。


iOS Extension


  • 作用:


  • 能为某个类添加成员变量,属性,方法;
  • 一般的类扩展写到.m文件中;
  • 一般的私有属性写到类扩展中

@interface MineViewController ()<UITableViewDelegate>
@property (nonatomic, strong) BaseTableView *tableView;
@end
@implementation MineViewController
@end


当需要声明一个属性,它对外是只读的,但是在内部是可以修改的,这时可以通过Extension来实现


Category 和Extension的区别


  • Category是运行时决定生效的,Extension是编译时就决定生效的


  • Category可以为系统类添加分类,Extension不能


  • Category是有声明和实现,Extension直接写在宿主.m文件,只有声明


  • Category只能扩充方法,不能扩充成员变量和属性


  • 如果Category声明了声明了一个属性,那么Category只会生成这个属性的set,get方法的声明,也就不是会实现


相关文章
|
6月前
|
安全 Android开发 数据安全/隐私保护
请说明鸿蒙操作系统与其他操作系统(如Android和iOS)的主要区别。
请说明鸿蒙操作系统与其他操作系统(如Android和iOS)的主要区别。
311 1
|
JSON JavaScript 前端开发
iOS小技能: 开发 uni-app 原生插件(支持iOS Extension)
术语:uni原生插件指的是将`原生开发的功能按照规范封装成插件包`,然后即可在 uni-app 前端项目中通过js调用原生能力。
1116 0
iOS小技能: 开发 uni-app 原生插件(支持iOS Extension)
|
6月前
|
API 开发工具 Android开发
iOS 和 Android 平台的开发有哪些主要区别?
iOS与Android开发区别:iOS用Objective-C/Swift,App Store唯一下载渠道;Android用Java/Kotlin,多商店发布(如Google Play、华为市场)。设计上,iOS简洁一致,Android灵活可定制。开发工具,iOS用Xcode,Android用Android Studio。硬件和系统多样性,iOS统一,Android复杂。权限管理、审核流程及API各有特点,开发者需依据目标平台特性进行选择。
262 3
|
6月前
|
Java 测试技术 API
安卓APP和iOS APP在测试上的区别是什么?
安卓APP和iOS APP在测试上的区别是什么?
183 0
|
6月前
|
安全 JavaScript 前端开发
IOS开发基础知识:介绍一下 Swift 和 Objective-C,它们之间有什么区别?
IOS开发基础知识:介绍一下 Swift 和 Objective-C,它们之间有什么区别?
256 0
|
Shell iOS开发
iOS 逆向编程(十)sh脚本(shell)编写与执行指令区别
iOS 逆向编程(十)sh脚本(shell)编写与执行指令区别
232 0
|
安全 小程序 iOS开发
iOS Odyssey 和 unc0ver 的区别
iOS Odyssey 和 unc0ver 的区别
553 0
|
JSON JavaScript 前端开发
iOS小技能: 开发 uni 原生插件(支持iOS Extension)
背景:app采用uni实现 需求: iOS App前台后台离线(杀死情况下)推送语音播报(到账xx元、收款播报、自定义推送铃)。 实现方式:uni-app 原生插件(支持iOS Extension)
467 0
iOS小技能: 开发 uni 原生插件(支持iOS Extension)
|
存储 安全 IDE
android studio 输出apk过程,apk中的文件格式(bsh文件,dex文件),JVM、DVM、ART的区别,IOS与安卓的区别,ART和Dalvi
android studio 输出apk过程,apk中的文件格式(bsh文件,dex文件),JVM、DVM、ART的区别,IOS与安卓的区别,ART和Dalvi
263 0
android studio 输出apk过程,apk中的文件格式(bsh文件,dex文件),JVM、DVM、ART的区别,IOS与安卓的区别,ART和Dalvi
|
存储 iOS开发
iOS Principle:Category(下)
iOS Principle:Category(下)
92 0
iOS Principle:Category(下)