iOS - EXC_BAD_ACCESS code = 1:在方法交换(method swizzling)初始化后,UIWebView崩溃。

3

我刚刚将我的应用程序转换为了ARC。由于Xcode提供的重构工具,转换部分成功。唯一不起作用的部分是一个奇怪的错误。

我使用了方法交换(method_exchangeImplementations),这样就可以调用myInitWithFrame代码而不是UIView的initWithFrame。重构过程在myInitWithFrame方法声明处引发了错误,因此我在方法声明之后添加了__attribute__ ((objc_method_family(init)))。现在,在iOS 6.0及以上版本上所有功能都完美地运行,但在iOS 5.0上(我想要支持的最低iOS版本)它不起作用。我收到了EXC_BAD_ACCESS(code=1,address=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个回答

5
这个问题很复杂。这个问题只在iOS 5上出现,而不是在iOS 6上出现,这是我第一次发现可能是苹果的问题或方法交换的问题。经过约一周的搜索,我得出结论应该给苹果技术支持发送电子邮件,看看他们是否能帮助我解决这个问题。
他们的回答是这是我们两方面的错。他说,在iOS 5中,UIWebView使用UIWebViewInternal类跟踪其自己的保留计数,并且我的方法交换在对象完全初始化之前将其保留,从而导致崩溃。当我没有使用ARC时,这不是一个问题,因为我从未在init函数中调用retain,但使用ARC会根据需要添加保留。他提到,在iOS 6中,UIWebViews不管理自己的保留计数,这就是为什么它在iOS 6中工作的原因。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接