博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[置顶] What is the difference between Category and Class Extension?
阅读量:6173 次
发布时间:2019-06-21

本文共 1895 字,大约阅读时间需要 6 分钟。

 

细心的人会发现当我们new 一个文件的时候会发现下图的部分.

但是这个问题来了Category 和 Extension 就近又什么区别呢?

实现这样一种场景,当我们用我们用NSArray的时候经常会遇到要去重的操作,可是自带的NSArray并没有这个方法,想要用你第一印象是自己写个类继承他,OC 给我们提供了一个方法可以直接在原有的基础上进行扩展.这就Category.分类能够做到的事情主要是:即使在你不知道一个类的源码情况下,向这个类添加扩展的方法。一个类可以有n+个分类,这些分类的实现可以在不同的文件中.

下面是我写的一个分类

NSArray+Unique.h

@interface NSArray (Unique)- (NSArray *) uniqueMembers;- (NSArray *) unionWithArray: (NSArray *) array;@end

NSArray+Unique.m

@implementation NSArray (Unique)- (NSArray *) uniqueMembers{    NSMutableArray *copy = [self mutableCopy];    for (id object in self)    {        [copy removeObjectIdenticalTo:object];        [copy addObject:object];    }    return [copy autorelease];}- (NSArray *) unionWithArray: (NSArray *) anArray{    if (!anArray) return self;    return [[self arrayByAddingObjectsFromArray:anArray] uniqueMembers];}@end

是不是很简单.但是应用Category还有如下

  1. Category可以访问原始类的实例变量,但不能添加实例变量,如果想添加变量,那就通过继承创建子类来实现。

  2. Category的优先级要高,当类中的方法跟原使类中的方法重名的时候是会重载原始类的方法.

  3. 和普通接口有所区别的是,在Category的实现文件中的实例方法只要你不去调用它你可以不用实现所有声明的所有方法。

  4. 不要在Category 调用 Super方法

扩展(Extension)人们往往以为就是匿名分类,因为他的语法看起来很像

下面是一个Extension

@interface ExtensionClass : NSObject  @property (retain, readonly) float value;@end  @interface ExtensionClass () {
//注意此处:扩展 } @property (retain, readwrite) float value; - (void)setValue:(float)newValue; @end @implementation ExtensionClass - (float)value { return value; } - (void)setValue:(float)newValue { value = newValue; } @end

虽然它们的语法的确很相似。虽然都可以用来为一个现有的类添加方法和属性,但它们的目的和行为却是不同的。

  1. 可以定义属性(实例变量)

  2. 在公共接口(类的声明中)中,开发者可以声明一个属性(实例变量)是只读的,随后在类扩展中声明为可写。这样,对外部代码而言,该属性(实例变量)将是只读的,而内部代码却可以使用它setter方法。

  3. 分类必须在第一个@interface中声明方法,并且在@implementation中提供实现,不然运行时出错。而类扩展的声明可以不在第一个@interface中去声明

另外 本人打算十一后离职换份工作,哪位仁兄公司有意向 站内信联系,帮忙内推下哈.

再打下广告哈 我搭建的个人博客 也已经上线了 引用的是hexo , 地址是  ui配色再微调中,对ie10 以下支持不太好 建议用chrome Firefox  或者safrari 浏览 另外也已经对移动设备做了响应是布局.

 

转载地址:http://ikqba.baihongyu.com/

你可能感兴趣的文章
Android Studio导出jar包
查看>>
通过python 爬取网址url 自动提交百度
查看>>
IT/互联网行业的工作者如何写好技术类文章?
查看>>
如何提问问题?--《提问的智慧》再次推荐
查看>>
我的友情链接
查看>>
乔布斯走了,苹果会坠落吗?
查看>>
EFI分区不格盘,不重新分区,不丢数据安装32位win7方法
查看>>
java高级_01
查看>>
win8重装成win8.1后把hyperv的虚拟机导入
查看>>
服务器上线流程
查看>>
文件搜索命令:find
查看>>
linux命令汇总(mkdir、rmdir、touch、dirname、basename)
查看>>
mv或者cp带小括号文件名解析问题总结
查看>>
Java程序编译与执行
查看>>
获取单选按钮的值
查看>>
Elasticsearch学习笔记3: bulk批量处理
查看>>
EBS12.2.5 升级到EBS12.2.6的问题及跟踪处理
查看>>
网站访问流程
查看>>
java的日志工具log4j的配置方法
查看>>
jQuery on()方法
查看>>