2013-09-11 5 views
0

내 코드 : 드문 상황에서아이폰 OS의 UIViewController, 왜 "자기"viewDidUnload에서 "야생 포인터"로 될

- (void)viewDidUnload{ 
    [super viewDidUnload]; 
    self.statusView = nil; 
    self.tableView = nil; 
    self.noDataView = nil; 
} 

, 내 응용 프로그램은 라인 self.noDataView = nil;에 추락했다. po self으로 디버깅 할 때 현재 컨트롤러가 아닌 다른 컨트롤러를 가리키는 것처럼 보였습니다. 가능한 이유는 무엇입니까?

PS : self.tableViewdelegate 및 은 방법으로 self으로 설정됩니다. 그게 어떤 관계가 있니?

+0

뷰를 없애기 위해 viewDidUnload를 구현하지 마십시오 ... 애플은 어쨌든이 방법에서 벗어났습니다. – mattyohe

+0

이러한 뷰는 NIB에 의해 생성되지 않고'init' 또는'loadView' 메소드의 코드에 의해 생성 된 다음'self.view'에 서브 뷰로 추가됩니다. – naiyi1984

답변

1

먼저 [super viewDidUnload]을 마지막 문으로 사용해야합니다. 그러나, 그것은 아마도 오류를 수정하지 않습니다.

문제의 원인은 매우 간단합니다. 귀하의 컨트롤러는 어딘가에서 과음됩니다. 좀비 감지 기능을 사용하도록 설정 했습니까? 응용 프로그램이 충돌하는 코드는 문제가 이전에 발생했기 때문에 일반적으로 적합하지 않습니다.

+0

근본적인 이유는 '컨트롤러'가 출시 된 것이지만 ** ARC **를 사용했기 때문에 어디서 이런 일이 발생했는지 알 수 없습니다. \ r \ n 또한'dangling point'는 즉시 파괴를 가져 오지 않는다는 것을 이해합니다. 그러나 여러 번 테스트하고 디버거가 매번 동일한 코드 줄 위치에 매달 리면 우연의 가능성은 거의 없다고 생각합니다. – naiyi1984

+0

이상하지 않다. 앱 크래시가 아닌 때마다 이상하지 않다. 드물지만 가끔 연속성이 멈추고 같은 줄 'self.noDataView = nil;'에서 멈춘다.이 줄 앞에는 'self'도 사용되지만 오류 없음. – naiyi1984

+0

@ naiyi1984 그 이유는이 코드에 문제가 전혀 없다는 것입니다. 컨트롤러가 이미 릴리스되어 더 이상 당신에게 속하지 않는 메모리를 덮어 쓰려고 할 때 충돌이 발생합니다. 경우에 따라 메모리를 덮어 쓰지 않고 때로는 덮어 쓰지 않는 경우도 있습니다. 그러나 문제는 컨트롤러가 과도하게 릴리스 된 것입니다. – Sulthan

0

viewWillUnload은 더 이상 지원되지 않으므로 더 이상 믿을 수 없습니다. 질문이 있으면 아래 참조로 연결됩니다. 애플에서

:

가 아이폰 OS 6에서, 의 UIViewController의 viewWillUnload 및 viewDidUnload 방법은 현재 사용되지 않습니다. 이러한 메서드 을 사용하여 데이터를 릴리스하는 경우 대신 didReceiveMemoryWarning 메서드를 사용하십시오. 은이 방법을 사용하여 뷰 컨트롤러보기에 대한 참조를 해제 할 수 있습니다. 이 작업을 수행하기 전에 뷰가 창에없는 것을 테스트해야합니다.

그리고 견적 WWDC 2012 :

방법 viewWillUnload 및 viewDidUnload. 더 이상 번으로 전화하지 않습니다. 우리가 경험 한 비용 베니핏 방정식과 분석이 있습니다. 초기에는 메모리 상 경고가 해제되도록 보기가 필요했습니다. 보기. 모든 종류의 그래픽 및 후원 점포가 있었고 도 언로드되었습니다. 이제는 뷰와 독립적으로 언로드 할 것이므로, 언로드되는 것은 우리에게는 큰 문제가 아닙니다. 및 포인터가있는 곳에서 많은 버그가있었습니다.

편집 : 당신이 viewDidLoad의 개체에게 그것을 만들거나 유지하는 않는, 그래서 아이폰 OS 5.1, viewDidUnload의 문제를 들어 는 뷰를 만들 때 당신이 만든 것을 해제하는 데 사용됩니다 또는 nib, 당신은 할 수있다 viewDidUnload에 공개하지 마십시오.

+0

나는이 방법이 iOS6에서 사용되지 않는다는 것을 알고 있지만 ** iOS 5.1.1 **에서이 크래시를 얻는다. 나는 그것이 여전히 유효해야한다고 생각한다. – naiyi1984

+0

'init' 또는'viewDidLoad'에서 self.noDataView를 초기화하고 있습니까? '장인'입니까? – null

+0

예. 'self.noDataView'가 올바르게 초기화되었습니다. 그것은 '콘센트'가 아닙니다. – naiyi1984