0
点赞
收藏
分享

微信扫一扫

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

Brose 2021-09-30 阅读 66

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

一、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.添加属性

2.获取属性值

二、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.添加方法函数

2.获取方法imp指针

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

举报

相关推荐

0 条评论