3

방금 ​​내 응용 프로그램을 ARC로 전환했습니다. 전환은 Xcode에서 제공하는 리펙토링 도구 덕분에 부분적으로 성공했습니다. 작동하지 않는 부분은 이상한 오류입니다.iOS - EXC_BAD_ACCESS 코드 = 1 (메서드 swizzling) 초기화 후 UIWebView가 충돌 함

메서드 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 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에는 작동하지 않는 이유가 있습니까?

답변

5

이 문제는 해결하기가 매우 어려웠습니다. 이 문제가 iOS 5에서만 나타나고 iOS 6에서는 나타나지 않았다는 사실이 사과 문제 또는 방법 문제를 일으킬 수 있다는 첫 번째 징후였습니다. 약 일 주일간 검색을 한 후, Apple 기술 지원 팀에 이메일을 보내서이 문제와 관련하여 도움을 줄 수 있는지 확인하기 위해 합의에 이르렀습니다.

그들의 답변은 모두 우리의 잘못이었습니다. 그는 iOS 5에서 UIWebView가 자체 유지 카운트 (UIWebViewInternal 클래스 사용)를 추적하고 완전히 초기화되기 전에 내 메서드가 객체를 유지하고 있다고 생각하여 충돌을 일으켰습니다. ARC를 사용하지 않았을 때 init 함수에서 retain을 호출하지 않았기 때문에 문제가 아니었지만 ARC를 사용하면 retain이 "적합"하다고 보았습니다. 그는 iOS 6에서 UIWebView는 자신의 보유 횟수를 관리하지 않기 때문에 iOS 6에서 작동한다는 것을 언급했습니다.

관련 문제