iOS 类别和扩展(Categories和Extensions)
2016-04-20 09:37
525 查看
分类(Category)
分类能够做到的事情主要是:即使在你不知道一个类的源码情况下,向这个类添加扩展的方法。
此外,分类能够保证你的实现类和其他的文件区分开。
使用分类为类添加方法(Add Methods to Classes)
通过在interface中声明一个额外的方法并且在implementation 中定义相同名字的方法即可。分类的名字(也就是括号括起来的CustomView)表示的是:对于声明于其他地方的这个类(UIViewController),在此处添加的方法是额外的,而不是表示这是一个新的类。你不可以通过分类为一个类添加额外的成员变量。
在implementation中,引入头文件的时候主要引用的方式是:
另外,虽然Category不能够为类添加新的成员变量,但是Category包含类的所有成员变量,即使是@private的。Category可以重新定义新方法,也可以override继承过来的方法。
类扩展(Class Extensions)
类扩展就像匿名(也就是没有那个括号里面的名字CustomView)的分类一样,除了一样不同的是,类扩展声明必须在@implementation在实现。
先看一段代码:
setNum是必须要实现,不然编译器会提出警告。
从上面看出,分类和类扩展的相似之处是:都可以为类添加一个额外的方法;
不同之处在于:要 添加额外方法,分类必须在第一个@interface中声明方法,并且在@implementation中提供实现,不然运行时出错。而类扩展,你添加的 方法是一个required API,如果不去实现,编译器会警告,而且这个方法的声明可以不在第一个@interface中去声明。
copy from http://blog.csdn.net/jiajiayouba/article/details/21104987
分类能够做到的事情主要是:即使在你不知道一个类的源码情况下,向这个类添加扩展的方法。
此外,分类能够保证你的实现类和其他的文件区分开。
1 #import “UIViewController.h” 2 @interface UIViewController(CustomView) 3 -(void)extMethod; 4 @end
使用分类为类添加方法(Add Methods to Classes)
通过在interface中声明一个额外的方法并且在implementation 中定义相同名字的方法即可。分类的名字(也就是括号括起来的CustomView)表示的是:对于声明于其他地方的这个类(UIViewController),在此处添加的方法是额外的,而不是表示这是一个新的类。你不可以通过分类为一个类添加额外的成员变量。
在implementation中,引入头文件的时候主要引用的方式是:
1 #import “UIViewController+CustomView.h” 2 @implementation UIViewController(CustomView) 3 -(void)extMethod; 4 @end
另外,虽然Category不能够为类添加新的成员变量,但是Category包含类的所有成员变量,即使是@private的。Category可以重新定义新方法,也可以override继承过来的方法。
类扩展(Class Extensions)
类扩展就像匿名(也就是没有那个括号里面的名字CustomView)的分类一样,除了一样不同的是,类扩展声明必须在@implementation在实现。
先看一段代码:
1 @interface MyObject:NSObject 2 { 3 NSNumber* number; 4 } 5 -(NSNumber*)getNum; 6 @end 7 8 @interface MyObject() //注意这里的括号里面是没有名字的 9 -(void)setNum:(NSNumber*)num; 10 @end 11 12 @implementation MyObject 13 -(NSNumber*)getNum 14 { 15 return number; 16 } 17 18 -(void)setNum:(NSNumber*)num 19 { 20 number = num; 21 } 22 @end
setNum是必须要实现,不然编译器会提出警告。
从上面看出,分类和类扩展的相似之处是:都可以为类添加一个额外的方法;
不同之处在于:要 添加额外方法,分类必须在第一个@interface中声明方法,并且在@implementation中提供实现,不然运行时出错。而类扩展,你添加的 方法是一个required API,如果不去实现,编译器会警告,而且这个方法的声明可以不在第一个@interface中去声明。
copy from http://blog.csdn.net/jiajiayouba/article/details/21104987
相关文章推荐
- iOS中的小知识点
- iOS 数据缓存
- iOS选中文字点击learn崩溃
- ios常用三方资源
- 【代码笔记】iOS-利用图片序列创建动态图片效果
- iOS巅峰之跑马灯
- ios,使用CocoaPods做第三方库的依赖管理
- iosGCD其一
- Cordova - 使用Cordova开发iOS应用实战4(调用摄像头拍照,并编辑)
- IOS开发基础知识--碎片37
- 分享一下自己ios开发笔记
- iOS的自动布局
- iOS 状态栏管理
- iOS 设置代理过程
- iOS 页面间传值 之 单例传值 , block 传值
- iOS 页面间传值 之 属性传值,代理传值
- iOS xml解析
- iOS 沙盒路径获取,创建文件
- iOS JSON 数据解析
- ios中获取各种文件的目录路径方法