一、什么是分类?

概念:分类(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. Matlab高级教程_第二篇:Matlab相见恨晚的模块_02_并行运算-2

    1 MATLAB并行计算-从个人桌面到远程集群和云(陈伟/魏奋)视频摘录笔记 https://cn.mathworks.com/videos/parallel-computing-with-matla ...

  2. RequestContextHolder getHttpServletRequest

    package me.zhengjie.common.utils; import org.springframework.web.context.request.RequestContextHolde ...

  3. day37-进程-锁和信号量

    #1.锁:房间的门上有一把锁,锁上有一把钥匙,一个人使用这把钥匙开锁之后,带上钥匙进入房间,把门给反锁了,他在房间干活, # 只要他不出来还锁,别人是无法进入房间的.同时只能有一个人在房间里干活.效率 ...

  4. vs2015的密钥

    最近一直提示VS要登陆,登陆完就说评估期已到,搞得很烦. VS2015 enterprise版本得密钥:  HM6NR-QXX7C-DFW2Y-8B82K-WTYJV    亲测有效!!! 专业版本的 ...

  5. [LC] 47. Permutations II

    Given a collection of numbers that might contain duplicates, return all possible unique permutations ...

  6. 3)Framework创建思路

  7. java 内存溢出-与gc

    感谢原作者 在日常中我们经常遇到这样的错误:java.lang.OutOfMemoryError: Java heap space. 但是除了heap space 的OutOfMemoryError, ...

  8. gin源码剖析

    介绍 Gin 是一个 Golang 写的 web 框架,具有高性能的优点,基于 httprouter,它提供了类似martini但更好性能(路由性能约快40倍)的API服务.官方地址:https:// ...

  9. C++中字符串的表示与转换

    转换总结 1.char*转string:可以直接赋值. 2.char[]转string:可以直接赋值. 3.char*转char[]:不能直接赋值,可以循环char*字符串逐个字符赋值,也可以使用st ...

  10. spring学习笔记三:Component注解(把POJO类实例化到spring的IOC容器中)

    Component注解:把普通的POJO 类实例化到spring的IOC容器中,就是定义成<bean id="" class=""> 项目目录树: ...