2012-01-13 1 views
1

UIViewController에 이상한 (아닌?) 문제가있는 것 같습니다. 컨트롤러가 dealloc되었을 때 컨트롤러가 서브 뷰를 해제하지 않는 것으로 보입니다. NSLog 메시지를 뷰 컨트롤러뿐만 아니라 모든 하위 뷰의 dealloc 메서드에 배치했습니다. 뷰 컨트롤러 dealloc가 호출되지만 서브 뷰는 호출되지 않습니다. 그런 다음 해당보기 컨트롤러의 다른 인스턴스를 탐색 스택에 밀어 넣으면 이전 인스턴스의 모든 하위 뷰가 릴리스됩니다 (콘솔에 NSLog 메시지가 나에게 알려짐). 나는 체크하고 프리젠 테이션 뷰 컨트롤러 (푸싱을 수행하는 뷰 컨트롤러)의 사용자 정의보기 컨트롤러에 대한 별도의 참조가 없다.dealloc (ARC 사용)을 할 때 UIViewController 하위 뷰를 해제하지 않음

하나의 작은 (어쩌면) 세부 정보 : 사용자 정의보기 컨트롤러는 저장하고 팝핑하기 전에 실행하는 블록을 수신합니다. 그러나, 나는 그것에 nil을 보내었고 나는 같은 행동을한다. 또한, 제시된 View Controller는 스택을 팝했을 때 dealloc을 수행하므로 유지 사이클이 발생하지 않습니다.

또한 사용자 지정보기 컨트롤러의 dealloc 메서드에서 각 뷰를 명시 적으로 해제하려고 시도했습니다. 같은 행동.

네비게이션 컨트롤러가 계속 잡고있을 가능성이 있습니까? 내 다른 뷰 컨트롤러 중 하나에이 작업을 수행하지 않는 것 같습니다.

내 문제는이 모든 하위 뷰 중 메모리 누수를 나타냅니다. 누수가 쌓이지는 않지만 여전히 누수입니다. 당신은 어쩌면이 시도

+2

최소한의 예제가 유용합니다. – Joe

+0

@Joe에 동의하고 코드를 공유합니다. 특히 이전에 누출 된 블록에 문제가있었습니다. 코드 경로가 실행되지 않는 이상이 값을 0으로 설정하면 문제가되지 않습니다. – Sam

+0

예제가 부족해 죄송합니다.하지만 총 두 줄의 클래스 (약 1,000 줄의 코드)와 관련이 있습니다. 코드에서 문제가 발생하는 위치를 알 수 없습니다. –

답변

7

좋아, 이것은 당황 스럽다. 나는 다른 클래스 (ViewDef라고 불리는)에서 문제를 발견했다. 나는 실수로 콜렉션 클래스로 사용했다. 그것은 내가 몇 가지 애니메이션 (몇 달 전에)을 처음으로 발견했을 때 내 하위 뷰를 추적하는 빠르고 더러운 방법이었습니다. ViewDef는 데이터베이스에서 검색된 프레임/글꼴/색상/etc 정보를 저장하므로 애니메이션 (오리엔테이션 사이)을 계산할 때보기를 저장하는 것이 편리했습니다. 이러한 ViewDef는 내 모델에 의해 저장되고 전달되었으므로 뷰는 유지되고 나중에 다른 뷰 컨트롤러로 대체되었습니다. 어쨌든, 나중에 이것을 고치기 위해 코드에 경고를 삽입하는 것을 잊어 버렸습니다.

이야기의 도덕 : 바보 같은 일을 할 계획이라면, 적어도 인터넷을 통해 방송 할 필요가 없도록 어리 석음을 문서화하십시오.

0

는 모든 파단 대표가 전무로 설정되어 있는지 확인하는 것입니다.

+0

그래, 내가 그것을 쓴 후에 그것을 시도했지만, 가지 마라. –

0

한 가지 도움이 될 것 viewDidUnload 방법에 전무로 파단 설정을 시도 할 수

+0

사실, 내 하위 뷰에는 대리인이 없습니다. 그들은 모두 사용자 정의보기입니다 사용 블록입니다. 그럼에도 불구하고, 이는 dealloc 될 사용자 정의보기 컨트롤러와 유지 사이클을 일으킬 것입니다. –