防止警告“PerformSelect may cause a leak because its selector is unknown”。

34

可能重复:
执行 performSelector 可能会导致泄漏,因为其选择器未知

我使用了 NSDictionary 将我的输入(NSString)转换为选择器。 "选择器映射" 如下所示:

[self setCmdSelectorMap:[NSDictionary dictionaryWithObjectsAndKeys: 
                         [NSValue valueWithPointer:@selector(doOpenBrowserByString:)], @"openBrowser",
                         [NSValue valueWithPointer:@selector(syncData:)], @"sync",
                         [NSValue valueWithPointer:@selector(getCachedString:)], @"getCachedString",
                         nil]];

当我尝试获取其中的一个选择器并执行它时,会出现警告:

sel = [[_cmdMap objectForKey:command] pointerValue];
NSLog(@"selector determined : %@", NSStringFromSelector(sel));
[self performSelector:sel withObject:arguments];

警告内容是:PerformSelector可能会因其选择器未知而导致泄漏。有没有办法防止出现这个警告?或者有没有更“安全”的方式来执行此操作?

谢谢大家 :)


@JacquesCousteau 你是怎么找到这么多时间来完成这些的?不管怎样,你在处理重复问题上做得很好,继续保持! - CodaFi
@Coda:我刚刚在搜索框中输入了"[objc] performSelector may cause leak",并查看了第一页的结果,但我很感激你的赞赏。 - jscs
谢谢大家,尽管警告的原因不完全相同,但我知道可以安全地忽略它。希望我们的项目没有警告,所以我会让编译器忽略它。再次感谢! - Rayer
1个回答

131

只需使用这个:

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
[self performSelector:sel withObject:arguments];
#pragma clang diagnostic pop

谢谢,这个完美地运行并且非常清晰易懂。 - migs647
7
我发现在类的实现开头使用#pragma clang diagnostic ignored "-Warc-performSelector-leaks"就足够了。 - Julian F. Weinert
12
没错,@Julian。不过通过使用"push/pop"指令,你可以确保只忽略你已经审查过的地方的警告。我认为这是一个好的实践方法。 - epologee
4
虽然消除警告的方法有效,但我鼓励不要忽略这些警告。请参考我在相关问题的回答以了解其中的原因。 - wbyoung

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接