美文网首页
#笔记# oc的selector转函数指针

#笔记# oc的selector转函数指针

作者: zjam9333 | 来源:发表于2018-11-21 15:12 被阅读0次

之前使用字符串转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);

相关文章

网友评论

      本文标题:#笔记# oc的selector转函数指针

      本文链接:https://www.haomeiwen.com/subject/alrcqqtx.html