一、什么是分类?

概念:分类(Category)是OC中的特有语法,它是表示一个指向分类的结构体指针。根据下面源码组成可以看到它没有属性列表,原则上是不能添加成员变量(其实可以借助运行时功能,进行关联),只能增加方法。

typedef struct objc_category *Category;
struct objc_category {
char *category_name OBJC2_UNAVAILABLE; // 分类名
char *class_name OBJC2_UNAVAILABLE; // 分类所属的类名
struct objc_method_list *instance_methods OBJC2_UNAVAILABLE; // 实例方法列表
struct objc_method_list *class_methods OBJC2_UNAVAILABLE; // 类方法列表
struct objc_protocol_list *protocols OBJC2_UNAVAILABLE; // 分类所实现的协议列表
}

分类的声明:

@interface 类名(分类名)
方法的声明;
... @end

分类的实现:

@interface 类名(分类名)
方法的实现;
... @end

作用:主要作用是为已经存在的类添加方法。在不改变原有类的前提下,动态地给这个类添加一些方法。

注意:

1.分类是用于给原有类添加方法的,因为分类的结构体指针中,没有属性列表,只有方法列表。

2.分类中可以写@property,但不会生成setter/getter方法,也不会生成实现以及私有的成员变量;

3.可以在分类中访问原有类中公开属性。

4.如果分类中有和原有类同名的方法,会优先调用分类的方法,会忽略原有类的方法。因此在开发中尽量不要覆盖原有类的方法。

5.如果多个分类与原有类,或者多个分类有分类间有相同的方法名,那么调用该方法的时候执行谁由编译器决定;编译器会执行最后一个参与编译的分类中的方法。

二、什么是扩展?

概念:Extension是Category的一个特例。类扩展与分类相比只少了分类的名称,所以称之为“匿名分类”。其实开发当中,我们几乎天天在使用。对于有些人来说像是最熟悉的陌生人。

类扩展的格式:

@interface XXX()

私有属性;
私有方法;(如果不实现,编译时会报警告,Method definition for 'XXX' not found) @end

作用:为一个类添加额外的原有类没有的变量,方法和属性;一般的类扩展写到.m文件中;一般私有属性写到.m文件的类扩展中。

注意:类扩展中添加的新方法,一定要实现。Category中没有这种限制。

三,分类与扩展的区别

1.类别中原则上只能增加方法(能添加属性的原因只是通过runtime解决setter/getter的问题而已);

2.类扩展不仅可以增加方法,还可以增加实例变量(或者属性),只是改实例变量默认是@private类型的;

3.类扩展中声明的方法没被实现,编译器会报警,但是类别中的方法没被实现的编译器不会报警的。因为类扩展是在编译阶段添加到类中,而类别是在运行时添加到类中。

4.类扩展不能像类别那样拥有独立的实现部部分(@implement部分),类扩展所声明的方法必须依托对应类的实现部分来实现。

5.定义在.m文件中的类扩展方法为私有的,定义在.h文件(头文件)中的文件扩展方法为公有的。

iOS中的分类和扩展的更多相关文章

  1. iOS中的分类(category)和类扩展(extension)

    今天在研究swift的时候看到了分类和扩展.这是两个十分重要有用的功能,但是之前用的不多,没有深入了解过,在今天就从头理一遍. 一.分类(Category): 概念: 分类(Category)是OC中 ...

  2. IOS中把字符串加密/IOS中怎么样MD5加密/IOS中NSString分类的实现

    看完过后,你会学到: 1学习IOS开发中的分类实现, 2以及类方法的书写, 3以及字符串的MD5加密/解密. ---------------------------wolfhous---------- ...

  3. ios 中Category类别(扩展类)小结

    类别 类别是一种为现有的类添加新方法的方式.利用Objective-C的动态运行时(runtime)分配机制,可以为现有的类添加新方法,这种为现有的类添加新方法的方式称为类别catagory,他可以为 ...

  4. ios中NSObject分类(2)

    #import <Foundation/Foundation.h> UIColor * rgb(int r, int g, int b); UIColor * rgbA(int r, in ...

  5. ios中NSObject分类

    #import <Foundation/Foundation.h> #define BUNDLE_PATH_IMAGENAME(c) [[NSBundle mainBundle] path ...

  6. iOS项目开发日常之创建文件(协议、类、分类、扩展)

    iOS项目开发过程中,是以不断创建文件的形式进行着的. 创建得比较频繁的文件类型是: 这两个类型中创建的文件有:子类.分类.扩展.协议四种文件,如下:    这四类文件是频繁创建的,我们来看一下各自分 ...

  7. Swift基础--Swift中的分类以及在分类中扩展init方法的注意事项

    Swift中的分类 1.创建一个空的swift文件 2.关键字extension,格式: extension 要扩展的类名 {} extension UIButton { } Swift中扩展init ...

  8. IOS中扩展机制Category和associative

    在ios开发中,有时候会遇到以下的问题,需要在一个类中添加自己的一些属性和方法.一般的做法是重写一个类来继承它,但是有时候就只是需要添加一些简单的属性和方法,那么这样做就显得过于麻烦,其实在IOS中还 ...

  9. iOS开发——高级篇——iOS中常见的设计模式(MVC/单例/委托/观察者)

    关于设计模式这个问题,在网上也找过一些资料,下面是我自己总结的,分享给大家 如果你刚接触设计模式,我们有好消息告诉你!首先,多亏了Cocoa的构建方式,你已经使用了许多的设计模式以及被鼓励的最佳实践. ...

随机推荐

  1. 存储过程获取QLIKVIEW关键数据

    declare @table table(DDID INT,FHDID INT ,CKDID INT,ZGYSDID INT,CWYSDID INT)--定义表变量来存放存储过程返回的内容insert ...

  2. 吴裕雄--天生自然python学习笔记:python安装配置tesseract-ocr-setup-3.05.00dev.exe

    下载地址:https://digi.bib.uni-mannheim.de/tesseract/tesseract-ocr-setup-3.05.00dev.exe 点击安装,记得复制安装的路径,待会 ...

  3. maxquant|

    使用maxquant 设定修饰: 设定打分值: 设定有标定量方法:iBAQ,虽然是无标定量方法,但是设定该值后也会有相应有标定量方法的iBAQ值. 根据计算机性能设定线程数: 设定酶切位点 最后生成文 ...

  4. zoj2588-tarjan求桥/割边

    tarjan求桥,算法流程详见核心代码: void tarjan(int k){ dfn[k]=low[k]=++cnt; //fa[k]=(edge){f,0,fid}; for(int i=hea ...

  5. linux系统--C语言程序开发的基本步骤(包含gcc的基本步骤)

    1.使用vi或者vim编写程序文件 2.使用gcc把所有的源文件翻译成计算机认识的格式(编译) 3.使用./a.out作为命令执行得到的可执行文件 gcc编译器的工作步骤: 1.处理所有的预处理指令 ...

  6. Mac下通过FFMpeg实现Android手机推流和播放

    一.Mac下搭建推流服务器(Nginx+RTMP+FFMpeg) 安装x264 git clone git://git.videolan.org/x264.git cd x264 ./configur ...

  7. JAVA异常处理原则和log4j输出详细异常分析

    1.多用try,catch;不要一个try,catch包含所有内容 好处:不同模块抓取不同异常,某一模块异常挂了,不影响其他模块的程序的进行 2.多写几个catche:尽量不要使用Exception这 ...

  8. A - Divide it! CodeForces - 1176A

    题目: You are given an integer nn. You can perform any of the following operations with this number an ...

  9. eclipse、myeclipse使用常用的小技巧

    1.修改类名称上的@author  *** Preference----Java----Code Style----Code Templates----->Comments----->Ty ...

  10. 修改 MyEclipse 编辑区域背景颜色