viewDidLoad와 viewDidAppear의 차이점


86

viewDidLoad과 의 차이점은 무엇입니까 viewDidAppear? 이러한 함수에는 어떤 종류의 초기화 또는 사용자 지정 코드가 포함됩니까?

예 :에 presentModalViewController있을 때만 작동 viewDidAppear하고 켜져 있지 않을 때만 작동합니다 viewDidLoad.


답변:


147

viewDidLoad뷰 컨트롤러가 메모리에 처음로드 될 때 정확히 한 번 호출됩니다. 여기에서 인스턴스 변수를 인스턴스화하고이 뷰 컨트롤러의 전체 수명주기 동안 유지되는 뷰를 빌드 할 수 있습니다. 그러나 일반적으로이 시점에서는보기가 아직 표시되지 않습니다.

viewDidAppear뷰가 실제로 표시 될 때 호출되고 뷰 컨트롤러의 수명주기 동안 여러 번 호출 될 수 있습니다 (예 : 모달 뷰 컨트롤러가 해제되고 뷰가 다시 표시 될 때). 여기에서 레이아웃 작업을 수행하거나 UI에서 그리기를 수행 할 수 있습니다 (예 : 모달 뷰 컨트롤러 표시). 그러나 여기서하는 모든 작업은 반복 가능해야합니다. 여기에 항목을 유지하지 않는 것이 가장 좋습니다. 그렇지 않으면 뷰가 사라질 때 해제하지 않으면 메모리 누수가 발생합니다.

참조 : https://developer.apple.com/documentation/uikit/uiviewcontroller


15
당신과 WrightsCS는 절대적으로 옳습니다. 그러나 머리카락을 나누는 것이 아니라 viewDidLoad일반적으로 한 번만 호출 되지만 다시 호출 될 수있는 상황이 하나 있습니다. 특히를 수신하면 didReceiveMemoryWarning보이지 않는 뷰가 해제 될 수 있으며 (뷰 컨트롤러는 변경되지 않았음에도 불구하고) 돌아올 때 viewDidLoad다시 호출 될 수 있습니다.
Rob

1
뷰 컨트롤러 ivars에 대한 의견에 항상 동의하고 자동으로 해제되는지 확실하지 않습니다 (컨트롤러 자체는 해제 되지 않음 ). 나는 우리 둘 다 쉽게 viewDidLoad를 구성 할 수 있다고 생각합니다 didReceiveMemoryWarning. 하지만를 작성할 때 좋은 관행을 사용한다면 viewDidLoad괜찮을 것이라는 데 동의 합니다. 내 유일한 요점은 ivars 및 수동 메모리 관리를 부주의하게 사용하면 viewDidLoad. 사람들은 didReceiveMemoryWarning그에 따라 시나리오와 프로그램에 민감해야합니다 .
Rob

2
요점을 설명하는 것이 아니라이 교환 후 24 시간 이내에 다른 질문에 답하면서 viewDidLoad유출 될 코드 의 종류에 대한 정확한 예를 발견했습니다 didReceiveMemoryWarning. 한숨.
Rob

1
이 답변은 다른 답변과 직접적으로 모순됩니다. stackoverflow.com/a/3411636/269753 메모리 경고를 전혀받지 않더라도 viewDidLoad 메서드가 한 번 이상 호출되는 것을 관찰했습니다. 누구든지 명확히하고 싶어?
Ricardo Sanchez-Saez 2013

2
모순이있는 것 같지 않습니다. 이 질문은 viewDidAppear가 아니라 viewDidLoad와 viewDidUnload 간의 관계에 관한 것입니다.
davidgoli 2013-04-26

21

간단히 말해서에서 컨트롤이나 배열을 만들고 싶을 것입니다 viewDidLoad.에서와 같이 viewDidAppear해당 컨트롤이나 배열을 새로 고치려는 위치입니다.

viewDidLoad컨트롤러가 생성 될 때 한 번 viewDidAppear호출되고 뷰, 음, DID가 나타날 때마다 호출됩니다. 따라서 표시하는 모달 뷰가 있다고 가정하면 해당 뷰가 닫힐 때 viewDidAppear호출되고 viewDidLoad호출되지 않습니다.


3
첫 번째 단락은 멋진 팁입니다. 그러나 두 번째 단락은 올바르지 않습니다. 두 번 이상 호출viewDidLoad 될 수 있습니다 . 표시되지 않은 뷰 (다른 뷰 스택 아래)가 메모리 부족 상황에서 이전 버전의 iOS에서 언로드 된 경우 뷰 컨트롤러는 화면에 다시 표시해야 할 때 뷰를 자동으로 다시로드합니다. 이후 버전의 iOS에서는 이전 iOS가 수행 한 작업을 수행하여 메모리 사용량을 줄이는 데 도움이되도록 선택할 수 있습니다. 메시지가 도착하면 오프 스크린보기를 언로드합니다. 이 경우 다시 호출됩니다. didReceiveMemoryWarningviewDidLoad
Basil Bourque 2013

@WrightsCS 공식 사과 문서가 있습니까? "컨트롤러가 생성 될 때 viewDidLoad는 한 번 호출됩니다."과거에 viewDidLoad는 메모리 부족 시나리오에서 여러 번 호출 될 수 있었기 때문입니다. 감사합니다.
Ricardo

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.