1.问题
项目中使用到了从字符串创建选择器,编译时发现警告:“performSelector may cause a leak because its selector is unknown”(因为performSelector的选择器未知可能会引起泄漏)
2.原因
在ARC模式下,运行时需要知道如何处理你正在调用的方法的返回值。这个返回值可以是任意值,如 void , int , char , NSString , id 等等。ARC通过头文件的函数定义来得到这些信息。所以平时我们用到的静态选择器就不会出现这个警告。因为在编译期间,这些信息都已经确定。
如
[someController performSelector:@selector(someMethod)];
...
- (void)someMethod
{
}
而使用 [someController performSelector: NSSelectorFromString(@“someMethod”)]; 时ARC并不知道该方法的返回值是什么,以及该如何处理?该忽略?还是标记为 ns_returns_retained 还是 ns_returns_autoreleased ?
3.解决办法
原来:
[module performSelector:NSSelectorFromString(@"someMethod"
withObject:application
withObject:launchOptions];
更改后
IMP imp = [module methodForSelector:NSSelectorFromString(@"someMethod"];
void (*func)(id, SEL,UIApplication *,NSDictionary *) = (void *)imp;
func(module,sel,application,launchOptions);