在使用我当前的 iOS 5 应用程序在 iOS 6 上进行测试时,我遇到了一些错误。
我们经历了一个在内部使用块但不作为属性的无害方法的方法返回锁定。问题是调用该方法有效,该方法中的每一行代码(包括使用代码的块)也是如此
我在调用块之前尝试使用 [块复制],但绝对没有变化。
在使用我当前的 iOS 5 应用程序在 iOS 6 上进行测试时,我遇到了一些错误。
我们经历了一个在内部使用块但不作为属性的无害方法的方法返回锁定。问题是调用该方法有效,该方法中的每一行代码(包括使用代码的块)也是如此
我在调用块之前尝试使用 [块复制],但绝对没有变化。
原来我的代码的函数定义是在内部接口中声明的,并且没有返回类型。
这里有一些图表来说明这个问题。
最初的错误
堆栈轨道
有问题的方法(与自身隔离以确定问题的确切位置)
函数实现(这是被调用并返回的)
私有接口中的定义
我决定查看函数调用,并注意到它返回 (id) 而不是 void
最后,唯一减轻此错误的代码更改。
解释
当我的客户打电话给我说我们的应用程序不能在 ios 6 上运行时,这个 bug 出现了
我被迫下载 iOS 6 和 Xcode 4.5 进行测试。
每次运行应用程序时,我确实崩溃了。
在谷歌链接的其他站点中寻找堆栈溢出的这个错误之后,我尝试了其他一些人遇到的阻塞问题。并尽我所能复制一份以尝试减轻保留对象从堆栈中脱落的问题。
我没有使用块属性,所以我只是在块本身上调用了副本。
这没有帮助。
最后与另一位开发人员一起与我一起讨论。我退后一步,从另一个角度看待它,并决定尝试确定到底保留了什么。
原来函数的结果被保留了。我想出来的唯一方法是查看自动完成显示我作为返回类型的值。
我知道返回类型是无效的,但是它告诉我返回类型是 id,这就是引发对方法定义的调查的原因。
我希望这可以帮助其他有这个问题的人,因为我花了大约 2 个小时来寻找它,结果证明这是一个不应该存在的结果类型之间的语义问题。