Swift有时会调用错误的方法

时间:2016-03-15 11:16:24

标签: ios swift

我在使用Swift项目时注意到了奇怪的行为。除了Swift有时会调用错误的方法,我无法解释它。这是非常罕见的,甚至在代码中添加空行也可能导致此错误消失。

让我在屏幕截图中解释我的意思,接下来我使用可以在Github上找到的SwiftDDP项目的CoreData示例,但是我能够在我自己的项目中看到这些问题。

我们在Todos.swift:74处可以看到断点,我希望下一次调用应该是getId()类的MeteorClient方法,因为它已经实例化了:

Screenshot 1

在Step Into之后,您可以看到同一个实例的ping()被调用:

Screenshot 2

接下来的两个步骤导致EXC_BAD_ACCESS例外:

Screenshot 3

在我的项目中,在我停止使用单例之前,我经常看到这个问题,所以它可能与Swift静态内存使用有关,或者我不理解一些不足为奇的东西,因为我对多线程和内存管理没什么经验。

我的环境是:

  • AppCode OC-145.184.11
  • Xcode Version 7.2.1(7C1002)
  • iOS 9.2 SDK
  • Apple Swift版本2.1.1(swiftlang-700.1.101.15 clang-700.1.81)

注意:这里我使用的是AppCode,但我在Xcode中看到了相同的行为,如果在Xcode中重现的相同问题无法在AppCode中重现,反之亦然。

如果有人能向我解释这种奇怪的行为,那将会很感激。

谢谢!

5 个答案:

答案 0 :(得分:8)

这恰好发生在我的团队中,使用Swift 2.2。这非常奇怪。这不是一个线程问题或异步问题,它是一个非常严重的问题。干燥的用例。我们调用了一个实例方法,另一个调用了它。我删除了被调用的方法,然后调用了上面那个被调用的方法。然后我将实际调用的方法移动到文件中的不同位置,看起来多个属性被调用。

这令人不安和担忧,因为现在您觉得您无法相信您的代码能够正常运行。

但是我们做了"解决"它。我们将方法移动到实际被触发的代码,经过一些小试验和错误正确的方法被调用。尚不确定这是否会表现为其他方法。

很高兴能够提供一个简单的项目,但这似乎不太可能,并且我无法分享我的代码的快照以苹果为基础。对于Swift的运行时间来说,它必定是一个完美的风暴。

答案 1 :(得分:0)

你有多个线程在运行吗?也许是一个网络线程?

我以为我也遇到了这个问题,但事实证明我的一个线程正在做某事,因为另一个线程崩溃了,它在一个随机点停止了另一个线程。我只注意到这个线程,所以它看起来像是随机的@IBAction函数崩溃了。

答案 2 :(得分:0)

当我切换到iPhone 6模拟器而不是iPhone 7时,它现在似乎正常工作!

答案 3 :(得分:0)

由于神秘的崩溃,我们的应用程序被拒绝审核。经过调试后,我发现它遇到了同样的问题 - 但仅限于Release方案!

所以我逐个浏览了Build Settings中的每个设置,看看是否将其切换到另一个方案的设置会解决问题:将ENABLE_TESTABILITY更改为true修复它......

答案 4 :(得分:0)

我认为,我有类似的问题。无法看到错误的函数被调用,但被调用的函数上的断点从未被击中,我无法进入它被调用的函数。我添加了一个具有相同参数列表和实现的新函数(我称之为wtf),并且该函数按预期工作,因此它必须是Swift编译器中的一个奇怪的链接问题。

更新:超级清洁似乎有效(见下文),但它并没有。看起来我将wtf功能留在了。

super 清理项目之后,看起来所有东西都按预期工作了:

  • clean(cmd + shift + k)
  • clean build dir(cmd + opt + shift + k)
  • 退出XCode
  • 删除派生数据(rm -rf ~/Library/Developer/Xcode/DerivedData/*

仅供参考,在我的例子中,我调用的函数是一个泛型基类,从一个通用子类调用,由一个专门的子子类触发。众所周知,Swift编译器中的泛型仍然非常错误,所以这可能是我遇到此问题的原因。