Objective-C 运行时-Category的使用

2017-02-15  本文已影响37人  Jinfei_Chen

Objective-C 运行时-Category的使用

Category 定义

类别是Objective-C的一项功能,可扩展类的接口,而无需对类进行子类化。category 可以为已经存在的类增加方法,而不需要增加一个子类。而且,我们可以在不知道某个类内部实现的情况下,为该类增加方法。和子类不同的是,Category不能用于向被扩展类添加实例变量,所以Category通常作为一种组织框架代码的工具来使用。如果我们想增加某个框架(framework)中的类的方法,category 就非常有效。

Category 用途

  1. 在不创建继承类的情况下实现对已有类的扩展。

  2. 简化类的开发工作(当一个类需要多个程序员协同开发的时候,Category可以将同一个类根据用途分别放在不同的源文件中,从而便于程序员独立开发相应的方法集合)。

  3. 将常用的相关的方法分组。

  4. 在没有源代码的情况下可以用来修复BUG。

Category 局限性

主要有两方面局限性:

  1. 无法向类中添加新的实例变量,类别没有位置容纳实例变量(可以通过associative来解决)。

objective-c有两个扩展机制:category和associative。我们可以通过category来扩展方法,但是它有个很大的局限性,不能扩展属性。于是,就有了专门用来扩展属性的机制:associative。

  1. 名称冲突,即当类别中的方法与原始类方法名称冲突时,类别具有更高的优先级。类别方法将完全取代初始方法从而无法再使用初始方法。这个类似于方法的重载,但是这里是直接覆盖了原方法。

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
上一篇下一篇

猜你喜欢

热点阅读