细心的人会发现当我们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还有如下

需要注意的问题:

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

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

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

  4. 不要在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注意事项:

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

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

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

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

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

 

[置顶] What is the difference between Category and Class Extension?的更多相关文章

  1. iOS UILabel 文字 置顶/置底 实现

    iOS UILabel控件默认文字位置是居中的,如图所示: 但是我们经常碰到这样的需求,希望文字向上置顶,或者向下置底,但是很遗憾,iOS API中并没有提供相应的属性和方法,需要我们手动设置. 利用 ...

  2. [置顶] Android开发笔记(成长轨迹)

    分类: 开发学习笔记2013-06-21 09:44 26043人阅读 评论(5) 收藏 Android开发笔记 1.控制台输出:called unimplemented OpenGL ES API ...

  3. 在UWP中页面滑动导航栏置顶

    最近在研究掌上英雄联盟,主要是用来给自己看新闻,顺便copy个界面改一下段位装装逼,可是在我copy的时候发现这个东西 当你滑动到一定距离的时候导航栏会置顶不动,这个特性在微博和淘宝都有,我看了@ms ...

  4. WinFrom窗体始终置顶

    调用WindowsAPI使窗体始终保持置顶效果,不被其他窗体遮盖: [DllImport("user32.dll", CharSet = CharSet.Auto)] privat ...

  5. winform窗体置顶

    winform窗体置顶 金刚 winform 置顶 今天做了一个winform小工具.需要设置置顶功能. 网上找了下,发现百度真的很垃圾... 还是必应靠谱些. 找到一个可以链接. https://s ...

  6. 自定义置顶TOP按钮

    简述一下,分为三个步骤: 1. 添加Html代码 2. 调整Css样式 3. 添加Jquery代码 具体代码如下: <style type="text/css"> #G ...

  7. ahk之路:利用ahk在window7下实现窗口置顶

    操作系统:win7 64位 ahk版本:autohotkey_L1.1.24.03 今天安装了AutoHotkey_1.1.24.03.SciTE.PuloversMacroCreator,重新开始我 ...

  8. Qt中让Qwidget置顶的方法

    一般来是说窗体置顶和取消只要        setWindowFlags(Qt::WindowStaysOnTopHint);        setWindowFlags(Qt::Widget); 要 ...

  9. js之滚动置顶效果

    0.js获取高度 ? 1 2 3 4 5 6 document.all   // 只有ie认识   document.body.clientHeight              // 文档的高,屏幕 ...

随机推荐

  1. nginx+php-fpm json_encode 到client pages 截断

    同样的数据rd环境is normal, but in test environment the result of json had been intercepted 稳定定位: nginx指定的磁盘 ...

  2. Linux学习之查看是否安装软件

    1.rpm包安装的,可以用 rpm -qa 看到,如果要查找某软件包是否安装,用 rpm -qa | grep "软件或者包的名字" 2.以deb包安装的,可以用 dpkg -l ...

  3. 非常值得学习的java 绘图板源代码

    package minidrawpad; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; impor ...

  4. javascript外部ファイル

    function myFunction() {    document.getElementById("demo").innerHTML = "Paragraph cha ...

  5. mini-httpd源码分析-tdate_parse.h

    ///关联字符串和整数 struct strlong { char* s; long l; }; ///将字符串中的大写字母转换成小写字母 static void pound_case(char* s ...

  6. linux修改文本模式下的分辨率(CentOS6.4)

    root登录 vi /boot/grub/menu.lst 看到如下界面: 红框全出位置为分辨率设置,设置参数如下: 保存 shutdown -r now

  7. 解密电子书之四:MCU(freescale)

    谈完国产的君正,让我们再看看呛了君正财路的freescale iMX51. 这是freescale近期的主打产品,用的是ARM Cortex A8架构,主频在消费电子领域最高可达800MHz,在工业领 ...

  8. 使用MIDAS访问远程Access数据库

    使用MIDAS访问远程Access数据库         Allen Tao(http://blog.csdn.net/allentao/) 2005-5-3 本文源码下载 访问远程数据库常用的办法是 ...

  9. android 设置头像以及裁剪功能

    在android的开发过程中,经常遇到设置用户头像以及裁剪图像大小的功能.昨天我遇到了设置用户头像的功能,开始不知道怎么搞,在技术群里问也没人回 答,就研究了微信用户设置头像的功能,了解到用户设置图像 ...

  10. CC++初学者编程教程(2) Microsoft Visual C++ 6.0开发环境搭建

    上一篇演示的是如何安装VS2010,本文演示的是如何安装Microsoft Visual C++ 6.0 简称VC6. 有同学经常VC6都是很古董的版本了,为啥他还存在,不得不说VC6是微软一个很经典 ...