我在使用Swift项目时注意到了奇怪的行为。除了Swift有时会调用错误的方法,我无法解释它。这是非常罕见的,甚至在代码中添加空行也可能导致此错误消失。
让我在屏幕截图中解释我的意思,接下来我使用可以在Github上找到的SwiftDDP项目的CoreData示例,但是我能够在我自己的项目中看到这些问题。
我们在Todos.swift:74
处可以看到断点,我希望下一次调用应该是getId()
类的MeteorClient
方法,因为它已经实例化了:
在Step Into之后,您可以看到同一个实例的ping()
被调用:
接下来的两个步骤导致EXC_BAD_ACCESS
例外:
在我的项目中,在我停止使用单例之前,我经常看到这个问题,所以它可能与Swift静态内存使用有关,或者我不理解一些不足为奇的东西,因为我对多线程和内存管理没什么经验。
我的环境是:
注意:这里我使用的是AppCode,但我在Xcode中看到了相同的行为,如果在Xcode中重现的相同问题无法在AppCode中重现,反之亦然。
如果有人能向我解释这种奇怪的行为,那将会很感激。
谢谢!
答案 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 清理项目之后,看起来所有东西都按预期工作了:
rm -rf ~/Library/Developer/Xcode/DerivedData/*
)
仅供参考,在我的例子中,我调用的函数是一个泛型基类,从一个通用子类调用,由一个专门的子子类触发。众所周知,Swift编译器中的泛型仍然非常错误,所以这可能是我遇到此问题的原因。