objc_retain EXC_BAD_ACCESS

The*_*der 7 exc-bad-access ios

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

我们已经经历了一个方法返回的锁定,这个方法返回一个内部使用块的无害方法,但不是属性.问题是调用方法是有效的,方法中的每一行代码都是有效的(包括使用代码的块)

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

The*_*der 20

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

这里有一些图形来说明这个问题.

初始错误

初始错误

堆栈轨道

堆栈跟踪

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

问题方法

函数实现(这是所谓的,并返回)

实施线

私有接口中的定义

私有接口中的定义

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

函数返回(id)

最后,唯一的代码更改减轻了这个错误.

代码变更

说明

当我的客户打电话给我说我们的应用程序不在ios 6上运行时,这个bug就变得丑陋了

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

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

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

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

这没有用.

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

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

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

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