在某些时候,程序可能需要根据获取的参数来决定调用的方法。
要实现这样的功能,就需要使用到动态运行时方法了。
首先需要定义好接口,以便调用。
然后就是动态调用定义好的方法。
这里有两种方法,
第一种:
// 有参数则需要加上冒号 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);