今天编译时发现警告:"performSelector may cause a leak because its selector is unknown"
找到解决办法如下:
方法一:使用函数指针方式
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);方法二:使用宏忽略警告
#define SuppressPerformSelectorLeakWarning(Stuff) \
do { \
_Pragma("clang diagnostic push") \
_Pragma("clang diagnostic ignored \"-Warc-performSelector-leaks\"") \
Stuff; \
_Pragma("clang diagnostic pop") \
} while (0)在产生警告也就是 performSelector 的地方用使用该宏,如
SuppressPerformSelectorLeakWarning(
[_target performSelector:_action withObject:self]
);如果需要 performSelector 返回值的话,
id result;
SuppressPerformSelectorLeakWarning(
result = [_target performSelector:_action withObject:self]
);
本文介绍了两种解决Objective-C中performSelector可能引发内存泄露警告的方法:一是通过函数指针实现,二是利用宏定义来抑制警告。这两种方法适用于不同场景。
2848

被折叠的 条评论
为什么被折叠?



