runtime函数详解

    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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值