美文网首页iOS常用
iOS runtime之--动态添加属性和方法

iOS runtime之--动态添加属性和方法

作者: 剑老师 | 来源:发表于2021-03-06 13:00 被阅读0次

    本文版权归公众号“一个老码农”所有。

    一、runtime添加属性

    在Objective-C中,category分类默认只能添加方法,不能添加属性。根本原因在于声明了@property后,category并不会自动生成set和get方法。如果有需要在category中添加属性,可以利用runtime的特性实现。

    //新建一个NSObject的category类,并添加一个customString属性
    @interface NSObject (Category)
    @property(nonatomic,copy)NSString *customString;
    @end
    
    //在.m文件中实现set、get方法,此时添加属性代码便完成了,就是如此简单
    #import "NSObject+Category.h"
    #import <objc/message.h>
    - (void)setCustomString:(NSString *)customString {
        objc_setAssociatedObject(self, &customStringKey, customString, OBJC_ASSOCIATION_COPY_NONATOMIC);
    }
    
    - (NSString *)customString {
        return  objc_getAssociatedObject(self, &customStringKey);
    }
    
    //测试一下,如果打印出1111,就代表添加属性成a国
    - (void)viewDidLoad {
        [super viewDidLoad];
         ///动态添加属性
        NSObject *objct = [[NSObject alloc] init];
        objct.customString = @"1111";
        NSLog(@"%@",objct.customString);    
    }
    

    动态添加属性,主要用到了两个runtime函数:
    1.添加属性

    添加属性函数

    此函数有四个参数。
    第一个参数指给哪个对象添加属性,第二个参数指属性的key指针,第三个参数指属性的名字,第四个参数指引用类型和原子性。
    其中着重讲一下第四个参数,此参数有五个值:
    OBJC_ASSOCIATION_ASSIGN 代表生成一个弱类型属性,相当于@property(atomic,assign)
    OBJC_ASSOCIATION_RETAIN_NONATOMIC相当于@property(nonatomic,strong)
    OBJC_ASSOCIATION_COPY_NONATOMIC,相当于@property(nonatomic,copy)
    OBJC_ASSOCIATION_RETAIN,相当于@property(atomic,strong)
    OBJC_ASSOCIATION_COPY,
    相当于@property(atomic,copy)
    上面代码生成的是string对象,所以我们一般用OBJC_ASSOCIATION_COPY_NONATOMIC

    2.获取属性值

    获取属性函数

    第二个函数是获取动态生成的属性,此函数有两个参数,第一个参数指的是哪个对象的属性,第二个参数为属性的key指针(每个动态添加的属性都需要有一个唯一的key)

    二、runtime动态添加方法

    为People类添加方法,如果运行后打印出“在唱歌”,说明添加方法成功

    ///例如我们有一个people类,people类中没有任何属性和方法,
    //我们为之添加一个名为sing的方法
    - (void)viewDidLoad {
        [super viewDidLoad];
        People *people = [[People alloc] init];
        //添加方法
        class_addMethod([People class], @selector(sing), class_getMethodImplementation([self class], @selector(peopleSing)), "v@:");
        //people调用刚添加的方法    
        [people performSelector:@selector(sing)];
    }
    
    - (void)peopleSing
    {
        NSLog(@"在唱歌");
    }
    

    添加方法主要用到两个runtime函数
    1.添加方法函数

    添加方法函数

    此函数有四个参数
    第一个参数代表为哪个类添加方法
    第二个参数代表添加的方法名称
    第三个参数已经实现的方法的imp指针

    第四个参数"v@:":v:表示添加方法返回值为void @表示是id类型(也就是要添加的类) :表示添加的方法SEL 如下图 第四个参数字符说明

    2.获取方法imp指针

    获取imp指针函数

    此函数为获取imp指针,做为第一个函数的参数传入,这个函数有两个参数。
    第一个参数为方法实现所在的类。
    第二个参数为实现的方法的SEL

    原文地址:iOS runtime之--动态添加属性和方法

    相关文章

      网友评论

        本文标题:iOS runtime之--动态添加属性和方法

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