2013-07-09 74 views
3

我剛剛將我的應用程序切換到ARC。由於Xcode提供的重構工具,轉換部分成功。一部分不起作用是一個奇怪的錯誤。iOS - EXC_BAD_ACCESS code = 1 UIWebView崩潰後(方法swizzling)初始化

我使用方法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做它的初始化之後,返回自我,然後崩潰。 在線程追蹤上,它表示它在[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?

回答

5

此問題修復起來非常複雜。這個問題只出現在iOS 5上,而不是iOS 6上,這是我的第一個跡象,那就是這可能是蘋果問題,或者是一種方法懸而未決的問題。經過大約一週的搜索後,我達成了一個共識,即我應該通過電子郵件向Apple技術支持發送電子郵件,以瞭解他們是否可以幫助解決此問題。

他們的回答是,這都是我們的錯。他說,在iOS 5中,UIWebView會記錄它自己的保留計數(使用一個UIWebViewInternal類),並且我的方法調整是在完全初始化之前保留對象,並導致崩潰。當我沒有使用ARC時,它不是問題,因爲我從來沒有在init函數中調用retain,但是使用ARC時,它會在「看到」適合時保留。他提到,在iOS 6中,UIWebViews不管理自己的保留計數,這就是它在iOS 6中工作的原因。