• 类别(category) 的作用 ? 通过rumtime给类别添加属性,


       类别(category) 可以在不获悉、不改变原来代码的情况下往里面添加新的方法,只能添加,不能删除修改,并且如果类别和原来类中的方法产生名称冲突,则类别将覆盖原来的方法,因为类别(category)具有更高的优先级。

     

       另外extensions的不同在于可以添加属性,添加的方法是必须要实现的;

      在正常的情况下,类别是不能添加属性的,但是可以通过rumtime添加一个伪属性,具体实现代码

    objc_AssociationPolicy的定义

    enum {

        OBJC_ASSOCIATION_ASSIGN = 0,

        OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1,

        OBJC_ASSOCIATION_COPY_NONATOMIC = 3,

        OBJC_ASSOCIATION_RETAIN = 01401,

        OBJC_ASSOCIATION_COPY = 01403

    };

    // textItem.h  文件中只有一个name的属性,通过rumtime给类别添加一个age属性。
    
    
    .h文件
    
    #import "textItem.h"
    #import <objc/runtime.h>
    
    @interface textItem (category)
    
    @property (nonatomic,copy) NSString *age;
    
    @end
    
    *********************
    .m文件
    
    #import "textItem+category.h"
    
    @implementation textItem (category)
    
    - (NSString *)age{
        return objc_getAssociatedObject(self, _cmd);
    }
    
    - (void)setAge:(NSString *)age{
        objc_setAssociatedObject(self, @selector(age), age, OBJC_ASSOCIATION_COPY_NONATOMIC);
        
    }
    @end ******************* 在VC中实现 - (void)viewDidLoad { [super viewDidLoad]; textItem *item = [[textItem alloc]init]; item.name = @"张三h"; item.age = @"123"; NSLog(@"%@ %@",item.name,item.age); }
  • 相关阅读:
    Object.defineProperty 监听对象属性变化
    Object.create(null) 和 {} 区别
    Vue 源码 基础知识点
    js setTimeout和setInterval区别
    Fiddler抓包工具使用方法
    使用 Jmeter 做 Web 接口测试
    Python 操作 SQL 数据库 (ORCAL)
    python连接MySQL数据库问题
    抓包工具Charles基本用法
    Python数据分析之pandas学习
  • 原文地址:https://www.cnblogs.com/weipeng168/p/7839573.html
Copyright © 2020-2023  润新知