iOS中经常用到的方法详解

class_addMethod使用(官方文档不放了)

class_addMethod(Class cls, SEL name, IMP imp,const char *types)
举例:

Person *p = [[Person alloc]init];
class_addMethod([Person class],
@selector(printPerson),class_getMethodImplementation([ViewController class], @selector(find)), "v@:");

解释:

  1. Class cls: 我们需要一个class,比如我的[Person class],就是我们即将动态添加方法的类
  1. SEL name: 这个名字自己可以随意想,就是添加的方法在本类里面叫做的名字,但是方法的格式一定要和你需要添加的方法的格式一样,比如有无参数。(调用的时候就是用的这个方法名)
  1. IMP imp:IMP就是Implementation的缩写,它是指向一个方法实现的指针,每一个方法都有一个对应的IMP。这里需要的是IMP,所以你不能直接写方法,需要用到一个方法:OBJC_EXPORT IMP class_getMethodImplementation(Class cls, SEL name)
    __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);
    这个方法也是runtime的方法,就是获得对应的方法的指针,也就是IMP。
  1. const char *types:
    比如:”v@:”意思就是这已是一个void类型的方法,没有参数传入。
    再比如 “i@:”就是说这是一个int类型的方法,没有参数传入。
    再再比如”i@:@”就是说这是一个int类型的方法,又一个参数传入。

最终意思就是为Person这个类动态添加一个方法,方法名叫做printPerson(),方法的实现是ViewController这个类里面的find方法的实现,也就是对应的IMP这个指针,最后就是参数及返回类型了,无参无返回:

对应这句代码:

@selector(printPerson),class_getMethodImplementation([ViewController class], @selector(find)), "v@:"); ```


最后调用的时候用这句代码:
`` [p performSelector:@selector(printPerson)]; ``

这样你的Person这个类里并没有printPerson()这个方法,但是却执行了这个方法.

你可能感兴趣的:(iOS中经常用到的方法详解)