2012-07-21 2 views
0

ios 응용 프로그램이 있습니다. 일부보기 컨트롤러에는 웹보기가 포함되어 있습니다. 모든 일 prolem를 제외하고, 좋은 작동합니다SIGKILL 웹 뷰와 함께 viewcontroller를 표시 할 때

응용 프로그램이 시작되고 난 몇 분 동안을 사용하고보다 내 일을 계속하지 않는 경우, 제대로 작동하지만 내가 웹보기의 ViewController로드 할 때, 그것과 충돌 SIGKILL 오류. 휴식 후에 다른 viewcontroller에 문제가 없습니다.

_webView = [[UIWebView alloc] initWithFrame:self.view.bounds)]; 
[self.view addSubview:_webView]; 
_webView.userInteractionEnabled = NO; 
[_webView release]; 
// here is the local page, the same happens if i load internet page.. 
NSString *path = [[NSBundle mainBundle] pathForResource:@"localpage" ofType:@"html"]; 
_url = [NSURL fileURLWithPath:path]; 
[_webView loadRequest:[NSURLRequest requestWithURL:_url]]; 

그래서 질문은 왜 응용 프로그램 충돌이 일부 중단 이후 webviews와 viewcontrollers를로드하려고 : 여기 내가 webviews에 사용하는 코드를 무엇입니까?

감사합니다. 여기

+0

viewController는 webViews에 있습니까? 어떻게 적재 했습니까? –

답변

3

코드는 매우 위험하다 :

_webView = [[UIWebView alloc] initWithFrame:self.view.bounds)]; 
[self.view addSubview:_webView]; 
_webView.userInteractionEnabled = NO; 
[_webView release]; 

내가 _webView는 바르라고 가정한다. 먼저 init과 dealloc을 제외하고 직접 ivars에 액세스하지 마십시오. 직접 ivar 액세스는 충돌의 # 1 원인입니다. 잘못하는 것이 너무 쉽습니다. 여기서 잘못하고 있습니다. 네가 네 일을 끝내기 전에 네가 네 일을 풀어주는거야. 당신은보기에 당신을 위해 그것을 잡을 내기를하고 있습니다. 그것은 일어날 수도 있고 그렇지 않을 수도 있습니다. 예를 들어,보기가 언로드 된 경우 (화면에서 벗어날 때 발생할 수 있음) _webView은 매달려있는 포인터가됩니다. 이 코드의 _url 외부에 액세스하는 경우

self.webView = [[[UIWebView alloc] initWithFrame:self.view.bounds)] autorelease]; 
[self.view addSubview:self.webView]; 
self.webView.userInteractionEnabled = NO; 

당신은 아래-유지 충돌이 발생할 수 있습니다 _url을, 또한 : 여기에 올바른 코드 (webView 가정은 retain 속성입니다). 다시 말하면 접근 자로 전환하면 해결됩니다.

self.url = [NSURL fileURLWithPath:path]; 
[self.webView loadRequest:[NSURLRequest requestWithURL:self.url]]; 

ARC로 전환하면이 문제와 다른 많은 문제가 매우 쉽게 사라집니다. 더 적은 크래시로 작성하기가 쉬울뿐만 아니라 ARC 코드는 정확하게 작성된 수동 메모리 관리보다 항상 빠릅니다. iPhoneOS 3을 지원해야하는 경우가 아니면 절대 ARC로 전환해야합니다.

+0

정말 감사합니다. – Buron