Objective-C——扩展(Extension)详解
来源:互联网 发布:数据采集器软件 编辑:程序博客网 时间:2024/04/30 01:59
我在上一篇博客中详细讲解了Category类别《Objective-C——类别(Category)详解》,而扩展和类别又十分的相似。我们今天就来深入学习扩展。该示例代码上传至:https://github.com/chenyufeng1991/Objective-C_Extension 。
Objective-C 2.0之后增加了Extension,所谓的扩展,其实为一个类添加额外的方法或者属性,这些方法和属性是私有的。而我们又常常把Extension成为匿名的Category。类扩展是在.m文件中声明私有方法非常好的方式。类扩展中的声明的方法与在类中声明的方法是完全一致的,需要在该类的@implementation中实现,该方法只在该类内部可见,对外不可见。
我们来简单区分一下Category类别和Extension扩展的区别:
(1)从某个类新建一个Category,会生成"类名称+Category名称".h和"类名称+Category名称".m两个文件;而从某个类新建一个Extension,只会生成一个"类名称_Extension.h"一个文件。
(2)Category中不可以定义属性或者变量;而Extension中可以定义属性或者变量。
(3)在Category中定义的方法可以被子类继承;而Extension中定义的方法和属性不能被子类继承,因为它们是private的。
(4)Category可以对自定义的类或者framework框架中的类增加方法;而Extension只能对自定义的类进行增加方法,因为你无法在框架类的实现文件中实现这些增加的方法,毕竟OC不是开源的,这些代码不可见。
(5)Category的名字是@interface 类名(Category名称),@implementation 类名(Category名称);而Extension名字只有@interface 类名();
(6)可以把Extension理解为特殊的Category;
我们通过代码来实现一下Extension:
(1)定义Person类,在Person.h中实现如下:
#import <Foundation/Foundation.h>@interface Person : NSObject- (instancetype)initWithName:(NSString*)aName;- (void)print;@property(nonatomic,strong) NSString *name;@end
(2)在Person.m中实现如下:
#import "Person.h"//定义一个Extension;@interface Person ()//对于普通变量,不能使用strong,retain,copy,只能使用assign;@property(nonatomic,assign) int age;//这是可以理解为private 类型的方法;只可以在该类@implementation内部调用;对外部不可见;- (void)printName;- (void)printAge;@end//类的实现文件;@implementation Person- (instancetype)initWithName:(NSString*)aName{ //使用父类的方法来初始化对象; self = [super init]; if (self) { //设置该对象的属性值; self.name = aName; self.age = 23; } //这里返回出去的是一个对象; return self;}- (void)print{ NSLog(@"Person print"); [self printName]; [self printAge];}//实现Extension中定义的方法;- (void)printName{ NSLog(@"name:%@",self.name);}- (void)printAge{ NSLog(@"name:%d",self.age);}@end
(3)在main.m中实现如下:
#import <Foundation/Foundation.h>#import "Person.h"int main(int argc, const char * argv[]) { @autoreleasepool { Person *jack = [[Person alloc] initWithName:@"jack"]; [jack print]; } return 0;}
(4)打印结果如下:
。
github主页:https://github.com/chenyufeng1991 。欢迎大家访问!
- Objective-C——扩展(Extension)详解
- objective-C中category与extension的探究——关于extension(类扩展)的实验和总结
- Objective-C分类 (category)和扩展(Extension)
- Objective-C分类 (category)和扩展(Extension)
- 【Objective-C】分类 (category)和扩展(Extension)
- Objective-C分类 (category)和扩展(Extension)
- Objective-C分类 (category)和扩展(Extension)
- 学习笔记(objective-c)-扩展(extension)
- Objective-C分类 (category)和扩展(Extension)
- Objective-C 类别(category)和扩展(Extension)
- Objective-C语言——Extension延展
- Objective-C——Category、Extension、Protocol
- ios学习路线—Objective-C(Extension)
- 黑马程序员——Objective-C分类 (category)和扩展(Extension)——黑马 ios 技术博客
- Objective-C分类 (category),扩展(Extension)和协议(protocol)
- Objective-C----Category 类别、Extension 扩展 专题总结
- 【IOS开发技术】 Objective-C分类 (category)和扩展(Extension)
- Objective-c - 延展:extension
- 【JAVA大作业开发记录(二)】
- cdh5.4.7 flume使用
- Python之正则表达式
- HTML学习 <11>
- CScrollView
- Objective-C——扩展(Extension)详解
- Cannot proceed with delivery: an existing transporter instance is currently uploading this package
- 第十周 项目3-利用二叉树遍历思想解决问题(5)
- 《C++ primer》英文第五版阅读笔记(十)——vector类型
- Mybatis注意事项
- MySQL丢数据及主从数据不一致的场景
- iOS字体设置
- 将指定路径的图片,显示在android系统相册中
- IDEA使用sbt打包运行出现java.lang.securityException的解决方法