执行选择器可能导致泄漏,解决方案快速崩溃



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

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

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)如何绕过它

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

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

如果我忽略警告并使用[self。目标performSelector:自我。选择器withObject self.argument):;

我的建议,那么,将抑制警告,只是调用performSelector:...

最新更新