我刚刚将我的应用程序切换到了 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];
在 myInitWithFrame 进行初始化后,它返回 self,然后崩溃。在线程跟踪中,它说它在 [UIWebView 保留] 方法上的苹果代码中崩溃(该方法显示为灰色),如下所示。
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?