The*_*ian 3 objective-c uiwebview swizzling ios automatic-ref-counting
我刚刚将我的应用程序切换到ARC.由于Xcode提供的重构工具,转换取得了部分成功.一部分不起作用是一个奇怪的错误.
我使用方法swizzling(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];
Run Code Online (Sandbox Code Playgroud)
在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:]
Run Code Online (Sandbox Code Playgroud)
很抱歉,线程跟踪格式不是很好,我没有足够的代表来发布图像.
是否有任何理由为什么相同的代码适用于iOS 6.0,而不是iOS 5.0?
这个问题很难解决.事实上这个问题只出现在iOS 5而不是iOS 6上,这是我第一次表明这可能是一个苹果问题,或者是方法调整问题.经过大约一周的搜索,我得出了一个共识,即我应该向Apple技术支持发送电子邮件,看看他们是否可以帮助我解决这个问题.
他们的反应是,这都是我们的错.他说,在iOS 5中,UIWebView跟踪它自己的保留计数(使用UIWebViewInternal类),并且我的方法调整是在完全初始化之前保留对象,这导致了崩溃.当我没有使用ARC时,这不是一个问题,因为我从不在init函数中调用retain,但是在ARC中它添加了"看到"合适的保留.他提到在iOS 6中UIWebViews不管理自己的保留计数,这就是它在iOS 6中运行的原因.
| 归档时间: |
|
| 查看次数: |
1201 次 |
| 最近记录: |