[置顶] What is the difference between Category and Class Extension?
细心的人会发现当我们new 一个文件的时候会发现下图的部分.
但是这个问题来了Category 和 Extension 就近又什么区别呢?
1:什么是Category?
实现这样一种场景,当我们用我们用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还有如下
需要注意的问题:
Category可以访问原始类的实例变量,但不能添加实例变量,如果想添加变量,那就通过继承创建子类来实现。
Category的优先级要高,当类中的方法跟原使类中的方法重名的时候是会重载原始类的方法.
和普通接口有所区别的是,在Category的实现文件中的实例方法只要你不去调用它你可以不用实现所有声明的所有方法。
不要在Category 调用 Super方法
2:什么是 Extension
扩展(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
虽然它们的语法的确很相似。虽然都可以用来为一个现有的类添加方法和属性,但它们的目的和行为却是不同的。
Class extensions注意事项:
可以定义属性(实例变量)
在公共接口(类的声明中)中,开发者可以声明一个属性(实例变量)是只读的,随后在类扩展中声明为可写。这样,对外部代码而言,该属性(实例变量)将是只读的,而内部代码却可以使用它setter方法。
分类必须在第一个@interface中声明方法,并且在@implementation中提供实现,不然运行时出错。而类扩展的声明可以不在第一个@interface中去声明
另外 本人打算十一后离职换份工作,哪位仁兄公司有意向 站内信联系,帮忙内推下哈.
再打下广告哈 我搭建的个人博客 也已经上线了 引用的是hexo , 地址是hufeng825.github.com ui配色再微调中,对ie10 以下支持不太好 建议用chrome Firefox 或者safrari 浏览 另外也已经对移动设备做了响应是布局.
[置顶] What is the difference between Category and Class Extension?的更多相关文章
- iOS UILabel 文字 置顶/置底 实现
iOS UILabel控件默认文字位置是居中的,如图所示: 但是我们经常碰到这样的需求,希望文字向上置顶,或者向下置底,但是很遗憾,iOS API中并没有提供相应的属性和方法,需要我们手动设置. 利用 ...
- [置顶] Android开发笔记(成长轨迹)
分类: 开发学习笔记2013-06-21 09:44 26043人阅读 评论(5) 收藏 Android开发笔记 1.控制台输出:called unimplemented OpenGL ES API ...
- 在UWP中页面滑动导航栏置顶
最近在研究掌上英雄联盟,主要是用来给自己看新闻,顺便copy个界面改一下段位装装逼,可是在我copy的时候发现这个东西 当你滑动到一定距离的时候导航栏会置顶不动,这个特性在微博和淘宝都有,我看了@ms ...
- WinFrom窗体始终置顶
调用WindowsAPI使窗体始终保持置顶效果,不被其他窗体遮盖: [DllImport("user32.dll", CharSet = CharSet.Auto)] privat ...
- winform窗体置顶
winform窗体置顶 金刚 winform 置顶 今天做了一个winform小工具.需要设置置顶功能. 网上找了下,发现百度真的很垃圾... 还是必应靠谱些. 找到一个可以链接. https://s ...
- 自定义置顶TOP按钮
简述一下,分为三个步骤: 1. 添加Html代码 2. 调整Css样式 3. 添加Jquery代码 具体代码如下: <style type="text/css"> #G ...
- ahk之路:利用ahk在window7下实现窗口置顶
操作系统:win7 64位 ahk版本:autohotkey_L1.1.24.03 今天安装了AutoHotkey_1.1.24.03.SciTE.PuloversMacroCreator,重新开始我 ...
- Qt中让Qwidget置顶的方法
一般来是说窗体置顶和取消只要 setWindowFlags(Qt::WindowStaysOnTopHint); setWindowFlags(Qt::Widget); 要 ...
- js之滚动置顶效果
0.js获取高度 ? 1 2 3 4 5 6 document.all // 只有ie认识 document.body.clientHeight // 文档的高,屏幕 ...
随机推荐
- Linux学习之lsof命令
lsof(list open files)是一个列出当前系统打开文件的工具.在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件.所以如传输控制协议 ...
- Demo 示例控制输入光标位置
<!DOCTYPE html> <html> <head> <meta charset=utf-8 /> <meta name="aut ...
- js点击更多显示更多内容效果
我写了一个简单的分段显示插件,用法很简单:1,把你要分面显示的内容的容器元素增加一个class=showMoreNChildren,并增加一个自定义属性pagesize="8" 这 ...
- 在git彻底删除commit记录的方法是什么?
在github上,如果非默认分支的话,直接用以下方法: git reset --hard <commit_id> git push origin HEAD --force 如是默认分支,需 ...
- 【servlet3.0新特性】Annotation注解配置
servlet3.0新特性Servlet3.0引入的若干重要新特性,包括异步处理.新增的注解支持.可插性支持等等,为读者顺利向新版本过渡扫清障碍.Servlet3.0新特性概述Servlet3.0作为 ...
- Eclipse 修改编码格式
在Eclipse的开发使用中,我们经常使用的是UTF-8,但是刚刚安装的或者是导入的项目是其他编码的默认是GBK的,这就造成我们的项目乱码,一些中文解析无法查看,对我们的开发造成不便. 修改工作空间默 ...
- J2SE知识点摘记(十八)
Java容器类类库的用途是“保存对象”,并将其划分为两个不同的概念: 1) Collection . 一组对立的元素,通常这些元素都服从某种规则.List必须保持元素特定的顺序,而Set 不能有重复 ...
- USB OTG ID 检测原理
OTG 检测的原理是: USB OTG标准在完全兼容USB2.0标准的基础上,增添了电源管理(节省功耗)功能,它允许设备既可作为主机,也可作为外设操作(两用OTG).USB OTG技术可实现没有主机时 ...
- cmd命令 拷贝某文件夹及其子文件夹文件到其它文件夹
@ECHO OFF cd/d %H:\FileLoc\CNET&cd.. ::echo 拷贝"%H:\FileLoc\CNET"中文件到"H:\FileLocTe ...
- 你应该知道CSS选择器技巧
什么是:before和:after? 该如何使用他们? :before是css中的一种伪元素,可用于在某个元素之前插入某些内容. :after是css中的一种伪元素,可用于在某个元素之后插入某些内容. ...