一、什么是分类?

概念:分类(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. 在维护项目中的UUID工具类

    import java.util.UUID; /** * <p> * Title:uuID生成器 * </p> * <p> * Description:UUID 标 ...

  2. Ubuntu 设置静态 IP

    一.背景 如果没有设置静态IP,由于某些情况,会导致系统的 IP 地址发生变化. 为了避免 IP 发生变化,就需要进行静态 IP 的设置. 注:这里 Ubuntu 版本为 19.10 二.解决方案 1 ...

  3. Graylog

    Graylog #Graylog 是与 ELK 可以相提并论的一款集中式日志管理方案,支持数据收集.检索.可视化 ​#Graylog 架构 - Graylog 负责接收来自各种设备和应用的日志,并为用 ...

  4. python3.7解释器安装及配置虚拟环境

    目录 环境准备 一.开始安装解释器(安装很简单,直接上图) 二.配置pip工具下载源 安装虚拟环境 环境准备 1.Windows系统,本人是 Windows10专业版 2.python解释器安装包,本 ...

  5. Unable to cast object of type 'System.Int32' to type 'System.String'.

    最近在研究.netcore,尝试把前后端完全分离.但是在写接口的时候,Post参数是FromBody的时候报错了 Microsoft.AspNetCore.Diagnostics.DeveloperE ...

  6. Variable|quantitative variables|continuous variable|discrete variable|qualitative variables| observation|data set

    2.1Variables and Data Variable:某物或某人的某一特征和其他个体不同. quantitative variables:定量变量either discrete (可以被数)o ...

  7. Wanna go back home

    题目描述 Snuke lives on an infinite two-dimensional plane. He is going on an N-day trip. At the beginnin ...

  8. F5 BIG-IP之二 LTM实验一

  9. 年度Java技术盘点,懂这些技术的程序员2019发展大好

    与一年前一样,Java仍然是最流行的编程语言.据TIOBE的数据显示,几十年来,Java比其他语言更常名列榜首,Java因为它拥有可移植性.可扩展性和庞大的用户社区,所以许多知名互联网公司使用Java ...

  10. POJ-1811-Prime Test(pollard_rho模板,快速找最小素因子)

    题目传送门 sol:Pollard_Rho的模板题,刚看了Pollard_Rho和Miller_Rabin很多原理性的东西看不懂,只是记住了结论勉强能敲代码. Pollard_Rho #include ...