天天看点

iOS动态运行时方法

在某些时候,程序可能需要根据获取的参数来决定调用的方法。

要实现这样的功能,就需要使用到动态运行时方法了。

首先需要定义好接口,以便调用。

然后就是动态调用定义好的方法。

这里有两种方法,

第一种:

// 有参数则需要加上冒号
SEL sel = NSSelectorFromString(@"save:");

MyObject obj = [MyObject new];

[obj performSelector:sel withObject:@{@"1":@"one"}];      

使用第一种方法,程序会出现警告。

第二种:(使用方法指针调用)

MyObject obj = [MyObject new];

SEL sel = NSSelectorFromString(@"save:");

IMP imp = [obj methodForSelector:sel];

/*
 * id 对象
 * SEL 对象的方法
 * id 方法的参数
 */    
void (*func)(id, SEL, id) = (void *)imp;

// 或者可以这样写

// ((void (*)(id, SEL, id))[obj methodForSlector:sel])(obj, sel, @{@"1":@"one"});

func(manager, sel, @{@"1":@"one"});      

另外,id类型的熟练使用非常重要。

NSString *param = @"{\"mm\":\"iosqiao\",\"yhm\":\"123456\"}";
  id obj = [NSJSONSerialization
      JSONObjectWithData:[param dataUsingEncoding:NSUTF8StringEncoding]
                 options:0
                   error:nil];
  MyObject *manager = [MyObject new];
  if (!manager) {
    return;
  }
  SEL sel = NSSelectorFromString(@"saveStorage:");
  IMP imp = [manager methodForSelector:sel];
  void (*func)(id, SEL, id) = (void *)imp;
  func(manager, sel, obj);      

转载于:https://www.cnblogs.com/hd1992/p/5648800.html