我收到了警告
PerformSelector可能会因为其选择器未知而导致泄漏
在代码中:
- (void) callDelegate: (SEL) selector withArg: (id) arg error: (NSError*) err
{
assert([NSThread isMainThread]);
if([delegate respondsToSelector: selector])
{
if(arg != NULL)
{
//this line the warning
[delegate performSelector: selector
withObject: arg
withObject: err];
}
else
{
//this line the warning
[delegate performSelector: selector
withObject: err];
}
}
else
{
NSLog(@"Missed Method");
}
}
标题
@interface Topscore : UIViewController <NSObject> {
//
}
答案 0 :(得分:43)
您的if ... respondsToSelector: selector
无法正常工作,因为您的selector
只是该方法的名称。对于您的情况,您需要检查
if ([delegate respondsToSelector: @selector(method::)]
,另一种情况仅适用于method:
。
无论如何,你可以像这样压制警告:
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
[self performSelector:nextView];
#pragma clang diagnostic pop
答案 1 :(得分:4)
这是编译器生成的警告,因为在启用编译和自动引用计数(ARC)时使用了-Wundeclared-selector。通常,这可以安全地忽略,因为显然名为“selector”的变量中的选择器在编译时是未知的,因为它将在运行时分配其值。
答案 2 :(得分:3)
您也可以使用objc_msgSend而不是performSelector,如here所述。
答案 3 :(得分:3)
您可以在WARNING_CFLAGS
中为Build Settings
添加 -Wno-arc-performSelector-leaks 。
答案 4 :(得分:0)
最简单的方法是将此宏添加到您的pch文件中。或.m文件..
#pragma GCC diagnostic ignored "-Wundeclared-selector"