美文网首页
Objective-C 运行时-Category的使用

Objective-C 运行时-Category的使用

作者: Jinfei_Chen | 来源:发表于2017-02-15 14:38 被阅读37次

    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
    

    相关文章

      网友评论

          本文标题:Objective-C 运行时-Category的使用

          本文链接:https://www.haomeiwen.com/subject/wxsqwttx.html