1、Category

  • 1)分类/类别(category):

    • 允许以模块的方式向现有类定义添加新的方法(默认不能添加实例变量)。用以扩展自己或他人以前实现的类,使它适合自己的需要。

    • 分类的名称括在类名之后的一对圆括号 "( )" 中。

      	@interface QCStudent (Print)
      @end @implementation QCStudent (Print)
      @end
    • 分类文件名使用符号“+”来分隔类和分类的名字(Xcode 会自动生成)。

      	QCStudent+Print.m
      QCStudent+Print.h
    • 分类用它可以将类的定义模块化到相关方法的组或分类中。它还提供了扩展现有类定义的简便方式,并且不必访问类的源代码,也无需创建子类。

    • 分类可以覆写该类中的另一个方法,但是通常认为这种做法是拙劣的设计习惯。一个类可以拥有多个分类。使用分类添加新方法来扩展类不仅会影响这个类,同时也会影响它的所有子类。分类为现有类添加新方法可能对你有用,但它们可能和该类的原始设计或意图不一致。对象/分类命名对必须是唯一的。

  • 2)分类中添加属性(实例变量):

    • iOS 开发中,分类默认不允许添加属性。

    • 但是如果在自己开发的框架中,希望在分类中动态添加属性,可以通过 OC 运行时的关联对象功能添加。在分类中,定义一个属性时,需要自己实现 getter & setter 方法,而且没有 _成员变量

    • 运行时非常重要的一个应用:给分类动态添加属性,结果能够让框架包装的更好,让使用者做出最小的修改。

2、向分类中添加方法

	// NSString+Path.h

		@interface NSString (Path)

		// 声明方法
- (NSString *)appendDocumentPath; @end // NSString+Path.m @implementation NSString (Path) // 实现方法
- (NSString *)appendDocumentPath { NSString *dir = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;
return [dir stringByAppendingPathComponent:self.lastPathComponent];
} @end // ViewController.m // 调用自定义方法
NSString *documentPath = [@"hello.png" appendDocumentPath];

3、向分类中添加属性

	// NSString+Path.h

		@interface NSString (Path)

		// 声明属性
@property (nonatomic, retain) NSURL *url; @end // NSString+Path.m // 包含运行时头文件
#import <objc/runtime.h> @implementation NSString (Path) /**
void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
id objc_getAssociatedObject(id object, const void *key) 参数:
object :属性的持有者
key :属性的键值
value :属性的数值
policy :属性的引用类型
*/ // 设置属性的键值
const void *UrlKey = @"UrlKey"; // 属性的 setter 方法
- (void)setUrl:(NSURL *)url { // 用运行时方法设置属性的值
objc_setAssociatedObject(self, UrlKey, url, OBJC_ASSOCIATION_RETAIN);
} // 属性的 getter 方法
- (NSURL *)url { // 用运行时方法获取属性的值
return objc_getAssociatedObject(self, UrlKey);
} @end // ViewController.m NSString *myStr = [[NSString alloc] init]; // 设置自定义变量的值
myStr.url = [NSURL URLWithString:@"http://123.com"]; // 获取自定义变量的值
NSURL *strUrl = myStr.url;

iOS - OC Category 分类的更多相关文章

  1. OC category(分类)

    // ()代表着是一个分类 // ()中的Test代表着分类的名称 @interface Student (Test) // 分类只能扩展方法,不能增加成员变量 - (void)test2; @end

  2. iOS - OC 面向对象语法

    1.类 1)根类:因为类 NSObject 是层次结构的最顶层,因此称为根类. 可以将类称为子类(subclass)和父类(superclass),也可以将类称为子类和超类. 2)分类/类别(cate ...

  3. OC基础--分类(category) 和 协议(protocol)

    OC 中的category分类文件相当于 C#中的部分类:OC 中的protocol协议文件(本质是头文件)相当于 C#中的接口.今天就简单说明一下OC中的这两个文件. 由于视频中的Xcode版本低, ...

  4. 关于ios object-c 类别-分类 category 的静态方法与私有变量,协议 protocol

    关于ios object-c 类别-分类 category 的静态方法与私有变量,协议 protocol 2014-02-18 19:57 315人阅读 评论(0) 收藏 举报 1.category, ...

  5. iOS OC语言原生开发的IM模块--RChat

    iOS OC语言原生开发的IM模块,用于项目中需要原生开发IM的情况,具备发送文字.表情.语音.图片.视频等完整功能,包含图片预览视频播放等功能,此项目将会长期更新如有问题可以提出,我的邮箱:fshm ...

  6. iOS类别(Category)

    iOS类别(Category)与扩展(Extension) 苹果的官方文档 Category在iOS开发中使用非常频繁.尤其是在为系统类进行拓展的时候,我们可以不用继承系统类,直接给系统类添加方法,最 ...

  7. ios+oc面试题

    ios+oc面试题     浅复制和深复制的区别?//浅拷贝和深拷贝答案:浅层复制(copy):只复制指向对象的指针,而不复制引用对象本身.//通过对象的指针来访问这个对象深层复制(mutableCo ...

  8. iOS仿京东分类菜单之UICollectionView内容

    在上<iOS仿京东分类菜单实例实现>已经实现了大部分主体的功能,本文是针对右边集合列表进行修改扩展,使它达到分组的效果,本文涉及到的主要是UICollectionView的知识内容,左边列 ...

  9. category分类

    /* 使用继承关系来扩充一个类,有一个弊病,高耦合性 category(分类,类别) 能够帮我们扩充一个类的功能 */ - (void)superJump { //    [self eat]; [s ...

随机推荐

  1. Java与.NET 的Web Services相互调用

    一:简介 本文介绍了Java与.NET开发的Web Services相互调用的技术.本文包括两个部分,第一部分介绍了如何用.NET做客户端调用Java写的Web Services,第二部分介绍了如何用 ...

  2. javaWEB国际化:DateFormat,NumberFormat,MessageFormat,ResourceBundle的使用

    DateFormat:格式化日期的工具类,本身是一个抽象类: NumberFormat:格式化 数字 到 数字字符串,或货币字符串的字符类; MessageFormat: 可以格式化模式字符串,模式字 ...

  3. CRB and His Birthday(背包)

    CRB and His Birthday Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...

  4. C++运算法优先级

  5. Java中通过JDBC远程连接Oracle数据库

    通过jdbc连接数据库,拢共分三步: 第一步:下载一个JDBC的驱动,然后把jar包扔到项目里并add to build path: 第二步:去本地oracle文件夹下找到“TNSNAMES.ORA” ...

  6. git总结

    1.先画个图,先对git的操作有个直观了解 2.分析下git中文件是怎么存储的 正如下面所示git存储不是每次更改就会产生一个新的文件,而是产生一个版本,这个版本对应着记录每个文件的不同情况 具体的存 ...

  7. LoadRunner使用之变量关联

    性能测试LR小结之参数关联(LoadRunner11.0) 关联对于LR是经常需要用到的,本章使用简单登录来介绍关联功能. 1.       Q:何为关联? 所谓的关联就是把脚本中某些写死的代码(ha ...

  8. WinFom基本属性

    常用窗体属性: AutoSroll:如果窗体内容超出了窗体范围,自动出现滚动条.默认是false. AutoSize:调节窗口大小时,保证使窗体内的内容必须全部显示出来. Location:控件左上角 ...

  9. placeholder 解决UITextField中placeholder和text文本同时显示的问题

    TextField都使用了placeholder属性,但在代码中又设置了text属性,因此ViewController会同时显示placeholder文本和text文本. 这个问题让我彻底崩溃.按道理 ...

  10. android 入门 003 (点击事件)

    点击事件 有四种实现方式. 1.内部类实现方式 1.0 package cn.rfvip.clickevent; import android.app.Activity; import android ...