【问题标题】:Perform selector may cause a leak workaround swift crash执行选择器可能会导致泄漏解决方法快速崩溃
【发布时间】:2015-10-16 15:49:49
【问题描述】:

我有一种情况,我想在目标上调用一个方法,在该目标上调用执行选择器会出现错误: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) 如何绕过它。

【问题讨论】:

  • 在 Swift 2.0 中你可以直接调用performSelector
  • 该框架仅在 Objective-C 中。 swift是使用这个框架的项目。
  • 好的,我想我已经回答了这个问题,因为回答了这些问题。你有一个可行的方法,所以我什至没有看到这个问题
  • 问题是我怎样才能摆脱警告(而不是抑制)并让它与swift一起工作?如果有人知道的话,我也很想知道 Objective-C 和 Swift 消息系统之间的区别。
  • @RASS:那你为什么要func(sender, self.selector, argument)?应该是func(self.target, self.selector, self.argument)

标签: objective-c swift performselector


【解决方案1】:

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

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

【讨论】:

  • 完美运行,谢谢!我在做什么和这段代码有什么区别?我假设我的代码向目标询问该方法,而在这里您使用objc_msgSeng 独立构建它?再次感谢!
【解决方案2】:

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

那么,我的建议是取消警告并直接致电performSelector:...

【讨论】:

  • 您引用的问题的答案告诉您如何抑制警告。
  • 我不喜欢仅仅压制警告。
  • 好吧,我确实提供了另一种解决方法,它会导致编译器停止警告你而不是人为地抑制它。
猜你喜欢
  • 1970-01-01
  • 2013-08-04
  • 2017-11-11
  • 2012-04-06
  • 2014-01-07
  • 2011-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多