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

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

ARC编译器警告我如下:

"performSelector may cause a leak because its selector is unknown".

我要做的是:

[_controller performSelector:NSSelectorFromString(@"someMethod")];

为什么我会收到这样的警告?我知道编译器不能检查选择器是否存在,但是为什么会导致泄漏呢?我怎样才能更改我的代码,使我不再收到这个警告呢?


PIPIONE
浏览 377回答 3
3回答

LEATH

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

绝地无双

我对此的猜测是:由于编译器不知道选择器,ARC无法强制执行正确的内存管理。实际上,有时内存管理通过特定约定绑定到方法的名称。具体来说,我在想方便建设者对决制作,使方法;前者按约定返回一个自动释放的对象;后者是一个保留的对象。约定基于选择器的名称,因此如果编译器不知道选择器,那么它就不能强制执行正确的内存管理规则。如果这是正确的,我认为您可以安全地使用您的代码,前提是确保内存管理一切正常(例如,您的方法不返回它们分配的对象)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

iOS