Class class = objc_allocateClassPair([NSObject class], "Cat", 0);
class_addIvar(class, "name", sizeof(id), log2(sizeof(id)), @encode(id));
class_addMethod(class, @selector(test), (IMP)&test, "v@:");//type必须跟实际类型相符v代表void @代表self :代表SEL
objc_registerClassPair(class);
id cat = [[class alloc] init];
[cat setValue:@"hehe" forKey:@"name"];
NSString *name = [cat valueForKey:@"name"];
[cat performSelector:@selector(test)];
void test(id self, SEL _cmd) {
NSLog(@"test------");
}
总结:
1.设置完类之后别忘了调用objc_registerClassPair(class)
2.从class_addMethod就可以看出imp就是函数指针,test是函数实现,加上&, &test就是函数指针了
3.定义函数时一定加上两个默认变量id self, SEL _cmd,否则无效。
4.引入头文件
#import <objc/runtime.h>
#import <objc/message.h>
5.方法常用的前缀,记住它然后看提示就行了
objc_
object_ 这个别露了
ivar_
method_
sel_
imp_
6.method的type
- (void)method1:(NSString *)name arg1:(int)age arg2:(NSString *)arg2;
用 method_getTypeEncoding 对应的是 v36@0:8@16i24@28
把其中的数字去掉就是 v@:@i@
v代表void
@代表id(self)
:代表SEL(_cmd)
i代表int(age)
@代表NSString*(arge2)
v36@0:8@16i24@28