使用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
网友评论