在某些时候,程序可能需要根据获取的参数来决定调用的方法。
要实现这样的功能,就需要使用到动态运行时方法了。
首先需要定义好接口,以便调用。
然后就是动态调用定义好的方法。
这里有两种方法,
第一种:
// 有参数则需要加上冒号
SEL sel = NSSelectorFromString(@"save:"); MyObject obj = [MyObject new]; [obj performSelector:sel withObject:@{@"":@"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, @{@"":@"one"});
另外,id类型的熟练使用非常重要。
NSString *param = @"{\"mm\":\"iosqiao\",\"yhm\":\"123456\"}";
id obj = [NSJSONSerialization
JSONObjectWithData:[param dataUsingEncoding:NSUTF8StringEncoding]
options:
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);