之前使用字符串转selector,遇到了“performSelector may cause a leak because its selector is unknown”警告,查询百度发现可以使用函数指针解决。
假设有方法 - (void)hello;
可以这样:
// id someobject ...
SEL selector = NSSelectorFromString(@"hello");
if ([someobject respondsToSelector:selector]) {
IMP imp = [self methodForSelector:selector];
void (*func) (id, SEL) = (void *)imp;
func(someobject, selector);
}
经测试,func传入的object必须填写准确的对象,因为到了具体的函数内就是“self”。
传入的selector可用_cmd变量获取。
如果是多个参数的方法则要在func后添加额外参数的类型:
例如[NSArray arrayWithObjects:]。
因为要求nil作为结尾,不传nil的话会crash。
SEL selector = @selector(arrayWithObjects:);
IMP imp = [NSArray methodForSelector:selector];
id (*func) (id, SEL, id, id, id) = (void *)imp;
id arr = func([NSArray class], selector, @(1), @(2), nil);
NSLog(@"arr : %@", arr);