执行选择器可能导致泄漏变通快速崩溃

时间:2015-10-16 15:49:49

标签: objective-c swift performselector

我有一种情况,我想在目标上调用一个方法,其中调用执行选择器会给出错误:PerformSelector may cause a leak because its selector is unknown

为了解决这个问题,我正在使用this SO question的优秀解决方案:

if (self.target) {
    IMP imp = [self.target methodForSelector:self.selector];
    void (*func)(id, SEL, id) = (void *)imp;
    func(self.target, self.selector, argument);
}

现在这段代码是我在Swift项目中使用的框架的一部分,它导致了崩溃。

如果我忽略警告并使用[self.target performSelector:self.selector withObject:self.argument];它可以正常工作。

所以... 我假设这与基本的Swift与Objective-C消息发送架构有关。请有人告诉我a)发生了什么事? b)如何绕过它。

2 个答案:

答案 0 :(得分:1)

发送消息的最直接方式(假设它需要一个对象参数并且不返回任何内容)是:

void (*func)(id, SEL, id) = (void (*)(id, SEL, id))objc_msgSend;
func(self.target, self.selector, self.argument);

答案 1 :(得分:0)

  

如果我忽略警告并使用[self.target performSelector:self.selector withObject:self.argument];它工作正常。

然后,我的建议是取消警告,只需拨打performSelector:...