类别使用场景

  • 见解一
    Category的主要作用是为已经存在的类添加方法。
    Objective-C 中的 Category 就是对装饰模式的一种具体实现。它的主要作用是在不改变原有类的前提下,动态地给这个类添加一些方法。

  • 见解二
    Category类别是Objective-C语言中提供的一个灵活的类扩展机制。类别可以在不获悉、不改变原来代码的情况下往一个已经存在的类中添加新的方法。类别只能添加新的扩展方法,而不能添加新的属性。类别扩展的新方法有更高的优先级,会覆盖同名的原类的已有方法。

优点

  • 声明私有方法
  • 分解体积庞大的类文件
  • 把Framework私有方法公开
  • 模拟多继承(另外可以模拟多继承的还有protocol)
  1. 当你在使用基础类库中的类时,你不想继承这些类而只想添加一些方法时。
  2. 相对于子类继承扩展,类别的另一明显优势是实现了功能的局部化封装,扩展的功能只会在本类被引用时看到。例如,假设原类为UIButton,现在要使用类别扩展一些用于模块A的方法,那么这些扩展方法就可以定义在一个叫做UIButton+A.h的头文件中,只有在引用UIButton+A.h的地方,才能看到原UIButton类有模块A添加的那些扩展方法,如果不需要模块A的功能,不引用UIButton+A.h头文件就看不到UIButton的那些扩展方法的存在,实现扩展模块的隔离。

Category源码:

Category 是表示一个指向分类的结构体的指针,其定义如下:
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; // 分类所实现的协议列表
}

我们可以看到,他是有实例方法列表,类方法列表,但是就是没有属性列表。
所以,原则上它只能增加方法,不能增加成员(实例)变量。如果要扩展类的属性,OC作为一个有动态性的语言,用到运行时编程,必须使用<obj/runtime.h>,使用objc_getAssociatedObject,objc_setAssociatedObject以及objc_removeAssociatedObjects.

扩展类别(Category)属性

示例代码如下:

1、先创建一个person类

#import <Foundation/Foundation.h>@interface Person : NSObject@property (nonatomic, copy) NSString *name;@end#import "Person.h"@implementation Person@end

2、新建一个分类,运用associative添加属性

#import "Person.h"@interface Person (addproty)@property(nonatomic, copy)NSString *addr;@end#import "Person+addproty.h"
#import <objc/runtime.h>@implementation Person (addproty)static char strAddrKey = 'a';- (NSString *)addr
{return objc_getAssociatedObject(self, &strAddrKey);
}- (void)setAddr:(NSString *)addr
{objc_setAssociatedObject(self, &strAddrKey, addr, OBJC_ASSOCIATION_COPY_NONATOMIC);
}@end

category、extension区别

  • 分类中原则上只能增加方法(能添加属性的的原因只是通过runtime解决无setter/getter的问题而已);
  • 类扩展的方法是一定要实现的方法。Category没有这个限制。这是因为类扩展是在编译阶段被添加到类中,而类别是在运行时添加到类中。
  • Category的方法不一定非要在@implementation中实现,也可以在其他位置实现,但是当调用Category的方法时,依据继承树没有找到该方法的实现,程序则会崩溃。

参考

iOS扩展类属性总结

iOS进阶之类别(Category)(9)相关推荐

  1. iOS中分类(category)和类扩展(Extension)的区别

    iOS中分类(category)和类扩展(Extension)的区别 一.分类的定义: 分类是OC中的特有语法,它是表示一个指向分类结构体的指针,它是为了扩展系统类的方法而产生的一种方式. 二.分类的 ...

  2. iOS进阶之架构设计MVVM的理解(3)

    iOS进阶之架构设计MVC(1) iOS进阶之架构设计MVP(2) 前言: 前两篇文章已经理解MVC.MVP的设计模式.特别是MVP,比较难以理解,不好把握.需要多多实践,对比.来优化P段,找到最适合 ...

  3. iOS进阶 - iOS如何监控崩溃

    转载自:https://blog.csdn.net/qxuewei/article/details/90760508 iOS进阶 - iOS如何监控崩溃 几种常见的崩溃 数组越界:给数组添加 nil: ...

  4. Magento: 单产品(product)或者当前类别(category)最大和最小价格 Min/Max Product Price in a Category...

    1. 当前类别最大最小价格: $minPrice = Mage::getModel('catalog/product')->getCollection()->addStoreFilter( ...

  5. iOS进阶 - 包大小:如何从资源和代码层面实现全方位瘦身

    iOS进阶 - 包大小:如何从资源和代码层面实现全方位瘦身 官方 App Thinning App Thinning 是由苹果公司推出的一项可以改善 App 下载进程的新技术,主要为了解决用户下载 A ...

  6. 类别(Category)的作用(三)---添加非正式协议

    在上一篇文章 类别(Category)的作用(二)中,详细说明类别的第二个作用,接下来是类别的第三个作用. 类别作用三:向对象添加非正式协议. 一.概念 显然这个名词是相对于正式协议而言的.什么是正式 ...

  7. Objective C 类别(Category)与类扩展(Extensions)

    一.类别(Category) 类别(Category)是一种可以为现有的类(包括类簇:NSString...,甚至源码无法获得的类)添加新方法的方式无需从现有的类继承子类.类别添加的新方法可以被子类继 ...

  8. iOS进阶开发-iOS性能优化-关东升-专题视频课程

    iOS进阶开发-iOS性能优化-3316人已学习 课程介绍         介绍了性能优化方法,其中包括内存优化.资源文件优化.延迟加载.持久化优化.使用可重用对象和并发访问等.这些内容都是非常重要的 ...

  9. iOS进阶课程-Passbook编程-关东升-专题视频课程

    iOS进阶课程-Passbook编程-1999人已学习 课程介绍         介绍了Passbook服务的重要性,Passbook服务的流程.还介绍了Pass风格.Pass内部结构.Pass创建. ...

最新文章

  1. python可以自学吗-python能够自学吗
  2. 怎么向后删除?(删除光标后的字符)(按delete键)
  3. 零基础学Python(第十一章 字符串处理)
  4. MySQL5.6 Performance_schema
  5. zk框架_ZK Web框架思想
  6. x210烧写流程(inand)
  7. 【牛客 - 157F】三轮(dp,分治fft)
  8. 17 岁高中生独立开发全球疫情追踪网站火了!
  9. PowerShell简介
  10. C语言——指针篇(四)多维数组和多维指针(内含数组指针和指针数组笔记)
  11. FINEMVC重定向和显示合计
  12. APP开发短信接口集成
  13. Steam怎么和Steam link远程畅玩?
  14. 15个基本不定积分公式和分类基本积分表
  15. dw自动生成html,如何用Dreamweaver快速创建HTML代码
  16. LeetCode(查找元素的第一个和最后一个位置)
  17. 单月营业额一个亿,任泉李冰冰黄晓明追着投钱!这家企业是谁
  18. word打字时后面的字会消失是什么原因?如何解决?
  19. onKeyUp方法简介
  20. MPU6050的dmp代码移植的过程--转

热门文章

  1. CyclicBarrier使用与原理
  2. Html5 FileReader 对文件进行Base64编码
  3. CommandBehavior.CloseConnection有何作用
  4. oracle 学习小结11
  5. ubuntu 防火墙打开关闭
  6. Java里边什么是值传递和引用传递?两个有什么区别
  7. Ubuntu侧边任务栏自动隐藏
  8. TensorFlow 损失函数
  9. js 中的new Image
  10. 安卓开发20:动画之Animation 详细使用-主要通过java代码实现动画效果