2012-02-23 2 views
1

iPhone 모달보기에서 UIPickerView 위젯을 표시하려면 UIViewController에 데이터를로드해야합니다.UIViewController에서 데이터로드 및 언로드

몇 가지 조사를 수행했는데이 부분이 answer 인 것으로 나타났습니다. 나는 내 데이터 읽기 코드를 initWithNibName:bundle:에 구현하고 데이터는 dealloc에서 언로드했다. 그러나 Instruments는 계속해서 모달 뷰를 표시 할 때 메모리 누수가 있음을 알리고 디버깅 중에는 뷰가 표시 될 때마다 initWithNibName:bundle:이 호출되었지만 dealloc은 정상 실행시에는 호출되지 않았습니다 (낮은 메모리로 인해 발생 함) 조건은 Apple의 UIViewController Class Reference 문서에 따라 적용되며 viewDidUnload에도 동일하게 적용됩니다.

viewDidLoad: 메서드에서 데이터로드가 끝나고 viewDidDisappear:에 데이터가로드되면 위젯에 데이터가 표시되고 누수가 없습니다.

당신은 사용자 데이터를 분리합니다 (즉, viewDidUnload)이 방법을 사용해서는 안 나 : 애플의 문서에서 하나의 코멘트에 언급하기 때문에, 나는이에 관해서 좋은 사례가 있는지 알고 싶습니다 쉽게 재현 할 수없는 기타 정보.

는 I 올바른 방법의 viewDidLoad에로드 데이터이었다 상정하고 메모리 부족 상태가 발생하지 않는 viewDidUnload에 대한 모든 참조를 해제하지만, 실제로는 후자의 방법은 호출되지 않고, 따라서마다 뷰가 표시되고 데이터가 다시로드되고 이전 데이터에 대한 참조가 손실되어 메모리 누수가 발생합니다.

의견을 보내 주셔서 감사합니다.

답변

1

보기가 표시 될 때마다 viewDidLoad이 호출되면 문제가 발생합니다. viewDidAppear이 호출되어야하지만 viewDidLoad은 뷰가 필요하고 뷰가 필요하고 viewDidUnload이 호출 된 경우에만 호출해야합니다.

+0

예, 나는'initWithNibName : bundle :'이 뷰가 표시 될 때마다 호출되는 것을 보았지만 간단한 UIViewController를 사용하고 있으며 UIPickerViewDelegate와' UIPickerViewDataSource' 프로토콜은 정상적인 동작을 변경합니다. 내 프로젝트의 기본 SDK는 ** 최신 iOS (iOS 5.0) **입니다. – rtovars

+0

글쎄, 모든 모달 프리젠 테이션을위한 새로운 뷰 컨트롤러를 만들고 있다고 가정 할 때, 모든 것들에 대해 'loadView'를 얻게 될 것이다. 만약 여러분이 커버 한 다음 그 뷰를 발견한다면, 당신은'loadView'를 가져서는 안됩니다. 반면에, 당신은 모달을 흐리게 할 때마다'탈옥 '을 얻어야합니다. 그렇지 않으면 하나 이상의 길잃은'보유'가 있음을 의미합니다. – smparkes

+0

아, 맞아요, 모든 모달 프레젠테이션을위한 새로운보기 컨트롤러를 만듭니다. 그러나 'dealloc'은 모달 뷰를 닫을 때 호출되지 않습니다. 보관소를 다시 확인하겠습니다. 감사! – rtovars

관련 문제