runTime常用方法

作者: super_2e20 | 来源:发表于2019-07-15 14:25 被阅读0次
使用runTime改变实例成员的值
    unsigned int count = 0;
   //获取h所有的实例变量 Ivar存放的指针数组     
 Ivar *ivar = class_copyIvarList([self.person class], &count);
for (int i =0; i <count; i++) {
    //实例变量
    Ivar var = ivar[i];
    const char *varName = ivar_getName(var);
    //转化一下
    NSString *name = [NSString stringWithUTF8String:varName];
    if ([name isEqualToString:@"_name"]) {
        object_setIvar(self.person, var, @"sun");
        break;
    }
}
使用runtime来交换两个方法
获取方法
Method m1 = class_getInstanceMethod([self.person class], @selector(run));
Method m2 = class_getInstanceMethod([self.person class], @selector(run:));
method_exchangeImplementations(m1, m2);

注意再次调用该方法不交换

使用runTime来动态添加方法
//使用runtime来动态添加方法 IMP方法指针 v@: v表示void @表示id :表示SEL
- (void)addMethod{
 class_addMethod([self.person class], @selector(let:), (IMP) sunMethod, "v@:@");

}

void sunMethod(id self,SEL _cmd,NSString *miles){
NSLog(@"%@",miles);

 }
如何给分类扩展它的属性

.h文件

#import "Person.h"
NS_ASSUME_NONNULL_BEGIN

@interface Person (mutil)
@property (nonatomic, strong) NSString *nick;
@end

NS_ASSUME_NONNULL_END

.m文件

 #import "Person+mutil.h"
#import <objc/runtime.h>
@implementation Person (mutil)

 const char * name = "nick";

 - (void)setNick:(NSString *)nick{
    objc_setAssociatedObject(self, &name, nick, OBJC_ASSOCIATION_COPY);

}

 - (NSString *)nick{

    return  objc_getAssociatedObject(self, &name);

}
@end

相关文章

网友评论

    本文标题:runTime常用方法

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