Objective-C 运行时-Category的使用
Category 定义
类别是Objective-C的一项功能,可扩展类的接口,而无需对类进行子类化。category 可以为已经存在的类增加方法,而不需要增加一个子类。而且,我们可以在不知道某个类内部实现的情况下,为该类增加方法。和子类不同的是,Category不能用于向被扩展类添加实例变量,所以Category通常作为一种组织框架代码的工具来使用。如果我们想增加某个框架(framework)中的类的方法,category 就非常有效。
Category 用途
-
在不创建继承类的情况下实现对已有类的扩展。
-
简化类的开发工作(当一个类需要多个程序员协同开发的时候,Category可以将同一个类根据用途分别放在不同的源文件中,从而便于程序员独立开发相应的方法集合)。
-
将常用的相关的方法分组。
-
在没有源代码的情况下可以用来修复BUG。
Category 局限性
主要有两方面局限性:
- 无法向类中添加新的实例变量,类别没有位置容纳实例变量(可以通过associative来解决)。
objective-c有两个扩展机制:category和associative。我们可以通过category来扩展方法,但是它有个很大的局限性,不能扩展属性。于是,就有了专门用来扩展属性的机制:associative。
- 名称冲突,即当类别中的方法与原始类方法名称冲突时,类别具有更高的优先级。类别方法将完全取代初始方法从而无法再使用初始方法。这个类似于方法的重载,但是这里是直接覆盖了原方法。
Objective-C 运行时机制
简单定义:苹果给开发这提供的一套在运行时动态创建类、添加属性/方法(不止这些,还有一些其他功能)的API,它是一套纯C语言的API,使用相应的API就可以通过Category给一个原本存在的类添加属性。
@[ 那应该如何使用 Category 呢? ]
使用Category对类进行方法的拓展网上太多现成的案例,下面演示如何进行属性的拓展:
.h 声明文件
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
@interface NSObject (CategoryWithProperty)
/**
* 要在Category中扩展的属性
*/
@property (nonatomic, strong) NSObject *property;
@end
.m 实现文件
#import "NSObject+CategoryWithProperty.h"
@implementation NSObject (CategoryWithProperty)
- (NSObject *)property {
return objc_getAssociatedObject(self, @selector(property));
}
- (void)setProperty:(NSObject *)value {
objc_setAssociatedObject(self, @selector(property), value, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end
网友评论