iOS - EXC_BAD_ACCESS代码= 1 UIWebView在(方法调整)init之后崩溃

时间:2013-07-09 22:25:08

标签: ios objective-c uiwebview automatic-ref-counting swizzling

我刚把我的应用转到了ARC。由于Xcode提供的重构工具,转换取得了部分成功。一部分不起作用是一个奇怪的错误。

我使用了方法调配(method_exchangeImplementations),因此它不会调用UIView的initWithFrame,而是调用myInitWithFrame代码。重构过程在myInitWithFrame的方法声明中引发了一个错误,所以我在声明方法之后添加了 __ 属性 __ ((objc_method_family(init)))。现在这一切都适用于iOS 6.0及以上版本,但在iOS 5.0(我想支持的最低iOS)上它不起作用。我得到一个EXC_BAD_ACCESS(代码= 1,地址= 0X28)。每次运行时都会出现完全相同的内存地址。

我有一个调用它的UIWebView:

[[UIWebView alloc] initWithFrame:webViewFrame];

在myInitWithFrame进行初始化后,它返回self,然后崩溃。 在线程跟踪上,它表示它在[UIWebView retain]方法的苹果代码中崩溃(方法显示为灰色),如下所示。

Thread 1, Queue : com.apple.main-thread
#0  0x3515a7d2 in -[UIWebView retain] ()
#1  0x316ddef4 in objc_retain ()
#2  0x0011528c in -[UIView(style) myInitWithFrame:]

很抱歉,线程跟踪的格式不是很好,我没有足够的代表发布图片。

是否有任何理由说明相同的代码适用于iOS 6.0,而不适用于iOS 5.0?

1 个答案:

答案 0 :(得分:5)

这个问题非常复杂。事实上这个问题只出现在iOS 5而不是iOS 6上,这是我第一次表明这可能是一个苹果问题,或者是方法调整问题。经过大约一周的搜索,我得出了一个共识,即我应该向Apple技术支持发送电子邮件,看看他们是否可以帮我解决这个问题。

他们的反应是,这都是我们的错。他说,在iOS 5中,UIWebView跟踪它自己的保留计数(使用UIWebViewInternal类),并且我的方法调整是在完全初始化之前保留对象,这导致了崩溃。当我没有使用ARC时,这不是一个问题,因为我从不在init函数中调用retain,但是在ARC中它添加了“看到”合适的保留。他提到在iOS 6中,UIWebViews不管理自己的保留计数,这就是它在iOS 6中工作的原因。