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. Caused by: javax.xml.bind.JAXBException: standardPremiumUpdateMessageDTO is not a valid property on

    Caused by: javax.xml.bind.JAXBException:  standardPremiumUpdateMessageDTO is not a valid property on ...

  2. BZOJ 1036:树的统计Count(树链剖分)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1036 题意:中文题意. 思路:也是普通的树链剖分.唯一注意的点是在change函数中 while(t ...

  3. WPF:获取控件内的子项

    一.界面内容(部分:仅供参考) <Window> <Window.Resources> <!--工具数据源--> <XmlDataProvider x:Key ...

  4. ACM题目————Anagram

    Description You are to write a program that has to generate all possible words from a given set of l ...

  5. SlickGrid example 2: 按想要的风格展示列

    先上效果图. 代码: <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http:// ...

  6. Inviting Friends(二分+背包)

    Inviting Friends Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To ...

  7. 周赛-The Number Off of FFF 分类: 比赛 2015-08-02 09:27 3人阅读 评论(0) 收藏

    The Number Off of FFF Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...

  8. logo上线

  9. python中字符串\r的奇怪问题

    示例: 我这里有一字符串: u'北京市工商行政管理局大兴分局\r <a onclick="showJDS(\'fa641bb3be5b44a1b618433833982fee\',\' ...

  10. SIGPIPE信号详解

    转自:http://blog.csdn.net/lmh12506/article/details/8457772 前一段面试的时候被问到项目中有没有处理SIGPIPE信号,怎么处理的?当时没有答出来, ...