objc_retain EXC_BAD_ACCESS

时间:2012-09-14 04:13:03

标签: ios exc-bad-access

使用我当前的iOS 5应用程序在iOS 6上测试时,我遇到了一些错误。

对于内部使用块的无害方法,我们遇到了方法返回的锁定,但不是作为属性。问题是调用方法是有效的,方法中的每一行代码都是有效的(包括使用代码的块)

我在调用块之前尝试使用[块复制],但绝对没有变化。

1 个答案:

答案 0 :(得分:20)

结果证明我的代码的函数定义是在内部接口中声明的,并且没有返回类型。

以下是一些用于说明此问题的图形。

初始错误

The Initial Error

Stack Track

The Stack Trace

问题中的方法(与自我隔离以确定问题的确切位置)

The Method in Question

功能实现(这是所谓的,并返回)

The Implementation Line

私有接口中的定义

The Definition in the Private Interface

我决定查看函数调用,并注意到它返回(id)而不是void

Function returning (id)

最后,唯一的代码更改缓解了这个错误。

Code Change

<强>解释

当我的客户打电话给我说我们的应用程序无法在ios 6上运行时,这个bug出现了丑陋的脑袋

我被迫下载iOS 6和Xcode 4.5进行测试。

每次运行应用程序时我确实崩溃了。

在追踪谷歌链接的其他网站上的堆栈溢出问题后,我尝试了其他一些人遇到的阻止问题。并尽可能地复制副本,以减轻保留对象从堆栈中掉落的问题。

我没有使用块属性,所以我只是在块本身上调用了副本。

这没有帮助。

最后,另一位开发人员和我一起讨论它。我正在退后一步,从另一个角度看待它,并决定试图确定保留了什么。

事实证明该功能的结果得以保留。我想出来的唯一方法是查看自动完成显示我作为返回类型的值。

我知道返回类型是无效的,但它告诉我返回类型是id,这是引发对方法定义的调查的原因。

我希望这可以帮助其他有这个问题的人,因为我花了大约2个小时追捕它,结果发现这是一个永远不存在的结果类型之间的语义问题。