iOS进阶之类别(Category)(9)
类别使用场景
见解一
Category的主要作用是为已经存在的类添加方法。
Objective-C 中的 Category 就是对装饰模式的一种具体实现。它的主要作用是在不改变原有类的前提下,动态地给这个类添加一些方法。见解二
Category类别是Objective-C语言中提供的一个灵活的类扩展机制。类别可以在不获悉、不改变原来代码的情况下往一个已经存在的类中添加新的方法。类别只能添加新的扩展方法,而不能添加新的属性。类别扩展的新方法有更高的优先级,会覆盖同名的原类的已有方法。
优点
- 声明私有方法
- 分解体积庞大的类文件
- 把Framework私有方法公开
- 模拟多继承(另外可以模拟多继承的还有protocol)
- 当你在使用基础类库中的类时,你不想继承这些类而只想添加一些方法时。
- 相对于子类继承扩展,类别的另一明显优势是实现了功能的局部化封装,扩展的功能只会在本类被引用时看到。例如,假设原类为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)相关推荐
- iOS中分类(category)和类扩展(Extension)的区别
iOS中分类(category)和类扩展(Extension)的区别 一.分类的定义: 分类是OC中的特有语法,它是表示一个指向分类结构体的指针,它是为了扩展系统类的方法而产生的一种方式. 二.分类的 ...
- iOS进阶之架构设计MVVM的理解(3)
iOS进阶之架构设计MVC(1) iOS进阶之架构设计MVP(2) 前言: 前两篇文章已经理解MVC.MVP的设计模式.特别是MVP,比较难以理解,不好把握.需要多多实践,对比.来优化P段,找到最适合 ...
- iOS进阶 - iOS如何监控崩溃
转载自:https://blog.csdn.net/qxuewei/article/details/90760508 iOS进阶 - iOS如何监控崩溃 几种常见的崩溃 数组越界:给数组添加 nil: ...
- Magento: 单产品(product)或者当前类别(category)最大和最小价格 Min/Max Product Price in a Category...
1. 当前类别最大最小价格: $minPrice = Mage::getModel('catalog/product')->getCollection()->addStoreFilter( ...
- iOS进阶 - 包大小:如何从资源和代码层面实现全方位瘦身
iOS进阶 - 包大小:如何从资源和代码层面实现全方位瘦身 官方 App Thinning App Thinning 是由苹果公司推出的一项可以改善 App 下载进程的新技术,主要为了解决用户下载 A ...
- 类别(Category)的作用(三)---添加非正式协议
在上一篇文章 类别(Category)的作用(二)中,详细说明类别的第二个作用,接下来是类别的第三个作用. 类别作用三:向对象添加非正式协议. 一.概念 显然这个名词是相对于正式协议而言的.什么是正式 ...
- Objective C 类别(Category)与类扩展(Extensions)
一.类别(Category) 类别(Category)是一种可以为现有的类(包括类簇:NSString...,甚至源码无法获得的类)添加新方法的方式无需从现有的类继承子类.类别添加的新方法可以被子类继 ...
- iOS进阶开发-iOS性能优化-关东升-专题视频课程
iOS进阶开发-iOS性能优化-3316人已学习 课程介绍 介绍了性能优化方法,其中包括内存优化.资源文件优化.延迟加载.持久化优化.使用可重用对象和并发访问等.这些内容都是非常重要的 ...
- iOS进阶课程-Passbook编程-关东升-专题视频课程
iOS进阶课程-Passbook编程-1999人已学习 课程介绍 介绍了Passbook服务的重要性,Passbook服务的流程.还介绍了Pass风格.Pass内部结构.Pass创建. ...
最新文章
- python可以自学吗-python能够自学吗
- 怎么向后删除?(删除光标后的字符)(按delete键)
- 零基础学Python(第十一章 字符串处理)
- MySQL5.6 Performance_schema
- zk框架_ZK Web框架思想
- x210烧写流程(inand)
- 【牛客 - 157F】三轮(dp,分治fft)
- 17 岁高中生独立开发全球疫情追踪网站火了!
- PowerShell简介
- C语言——指针篇(四)多维数组和多维指针(内含数组指针和指针数组笔记)
- FINEMVC重定向和显示合计
- APP开发短信接口集成
- Steam怎么和Steam link远程畅玩?
- 15个基本不定积分公式和分类基本积分表
- dw自动生成html,如何用Dreamweaver快速创建HTML代码
- LeetCode(查找元素的第一个和最后一个位置)
- 单月营业额一个亿,任泉李冰冰黄晓明追着投钱!这家企业是谁
- word打字时后面的字会消失是什么原因?如何解决?
- onKeyUp方法简介
- MPU6050的dmp代码移植的过程--转