原因
因为在ARC的情况下,运行时需要知道你的返回值,可能是id,NSString等,但是直接performSelector系统不知道返回值的,不知道该如何处理
[self.target1 performSelector:NSSelectorFromString(@"self.action1") withObject:self];
[self.target1 performSelector:self.action1 withObject:self];
解决方法
1 用函数指针的方法
SEL selector = NSSelectorFromString(@"someMethod");
IMP imp = [_controller methodForSelector:selector];
void (*func)(id, SEL) = (void *)imp;
func(_controller, selector);
当有额外的参数
SEL selector = NSSelectorFromString(@"processRegion:ofView:");
IMP imp = [_controller methodForSelector:selector];
CGRect (*func)(id, SEL, CGRect, UIView *) = (void *)imp;
CGRect result = func(_controller, selector, someRect, someView);
2 使用通用的消除警告的方法
使用宏定义,方便调用
#define SuppressPerformSelectorLeakWarning(Stuff) \
do { \
_Pragma("clang diagnostic push") \
_Pragma("clang diagnostic ignored \"-Warc-performSelector-leaks\"") \
Stuff; \
_Pragma("clang diagnostic pop") \
} while (0)
例子
无返回值
SuppressPerformSelectorLeakWarning(
[_target performSelector:_action withObject:self]
);
有返回值
id result;
SuppressPerformSelectorLeakWarning(
result = [_target performSelector:_action withObject:self]
);
参考博客
http://blog.youkuaiyun.com/majiakun1/article/details/46424925