为了账号安全,请及时绑定邮箱和手机立即绑定

性能选择器可能会导致泄漏,因为它的选择器是未知的。

性能选择器可能会导致泄漏,因为它的选择器是未知的。

iOS
PIPIONE 2019-06-18 10:04:36
性能选择器可能会导致泄漏,因为它的选择器是未知的。ARC编译器警告我如下:"performSelector may cause a leak because its selector is unknown".我要做的是:[_controller performSelector:NSSelectorFromString(@"someMethod")];为什么我会收到这样的警告?我知道编译器不能检查选择器是否存在,但是为什么会导致泄漏呢?我怎样才能更改我的代码,使我不再收到这个警告呢?
查看完整描述

3 回答

?
LEATH

TA贡献1936条经验 获得超6个赞

在Xcode 4.2中的LLVM3.0编译器中,可以按照以下方式抑制警告:

#pragma clang diagnostic push#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
    [self.ticketTarget performSelector: self.ticketAction withObject: self];#pragma clang diagnostic pop

如果在多个地方都有错误,并且希望使用C宏系统来隐藏实用程序,则可以定义宏以使其更容易地抑制警告:

#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]);


查看完整回答
反对 回复 2019-06-18
?
绝地无双

TA贡献1946条经验 获得超4个赞

我对此的猜测是:由于编译器不知道选择器,ARC无法强制执行正确的内存管理。

实际上,有时内存管理通过特定约定绑定到方法的名称。具体来说,我在想方便建设者对决制作,使方法;前者按约定返回一个自动释放的对象;后者是一个保留的对象。约定基于选择器的名称,因此如果编译器不知道选择器,那么它就不能强制执行正确的内存管理规则。

如果这是正确的,我认为您可以安全地使用您的代码,前提是确保内存管理一切正常(例如,您的方法不返回它们分配的对象)。


查看完整回答
反对 回复 2019-06-18
  • 3 回答
  • 0 关注
  • 373 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信