2014-04-22 2 views

답변

2

KVO의 중요한 점은 removeObserve 및 addObserver 호출과 일치해야하며 중복 된 옵서버를 추가 할 수 없다는 것입니다. 즉, 관찰자를 추가하는 위치와 제거한 위치를 신중하게 고려해야하므로 이러한 제한 사항 중 하나를 위반하지 않습니다.

viewDidLoad에 추가하면 현재 viewDidUnload가 더 이상 사용되지 않으므로 dealloc에서 제거하는 것으로 충분하지만보기가 표시되지 않으면 관찰자가 트리거 될 수 있습니다. viewDidUnload가 여전히 호출되는 구형 OS에서 실행중인 경우 관찰자가 언제 제자리에 있고 그렇지 않은지를 추적해야하므로 문제가 될 수 있습니다.

viewDid/WillAppear에 추가 할 수 있습니다.이 경우 viewDid/WillDisappear에서 제거해야합니다. 호출이 (일반적으로 말하면) 일치가 보장되기 때문에 일반적으로이 메소드는보다 깔끔합니다.

3

addObserver/removeObserver 전화를 적절하게 페어링해야합니다.

당신은 다음과 같은 몇 가지 init 방법 또는 viewDidLoad 다음 deallocremoveObserver를 호출하면 호출되는 곳에서 addObserver를 호출하는 경우.

viewWillAppear과 같이 여러 번 호출되는 곳에서 addObserver을 호출하면 removeObserverviewWillDisappear으로 호출하십시오.

중요한 것은 적절한 페어링입니다.

+0

답변 주셔서 감사합니다. 어떻게 관찰자와 어떻게 작동하는지 그리고 필요한 로직에 달려 있지만 뷰에서 사용한다고 생각합니다 .Disappear는 메모리 사용으로 좋지 않습니다. 예를 들어 IBAction도 추가 할 수 있습니다. 예를 들어보기를 숨기고 관찰자도 제거하십시오 =) 또는 다른 미친 아이디어) –

+0

'viewWillDisappear'에서 관찰자를 제거하는 메모리 문제가 있다고 생각하는 이유를 모르겠습니다. 앞서 언급했듯이'viewWillAppear'에서'addObserver'를 호출하면'viewWillDisappear'에서'removeObserver' 만 호출하면됩니다. 그것이 당신의 필요를 충족시키지 못한다면 두 가지 방법으로 옵저버를 설정/제거하지 마십시오. 귀하의 필요에 맞는 쌍을 사용하십시오. – rmaddy

+0

그래서, 신경 쓰지 마세요) 나는 단지 제안을 듣고 싶었고 모든 대답이 좋다. 나는 내가 혼란스러워했다고 생각한다. –

2

참조하는 링크는 상대적으로 유익하고 정확합니다.

나는 이러한 관점에서 생각 : 그것은 단지 화면에있는 동안

가) VC 알림을 필요합니까? viewWillAppear/viewWillDisappear를 사용하십시오.

b) VC는 그것이 살아있을 때 (화면 상 반드시 필요한 것은 아님) 알림을 받아야합니까? init 또는 viewDidLoad를 사용하고 dealloc에서 제거하십시오.

ARC에서 내 dealloc 메서드를 중단하고 예상 한대로 호출했습니다. 그러나 viewDidUnload는 호출되지 않습니다.

+0

예, 저는 솔직하게 생각이 들었습니다.보기가 꺼져 있고 컨트롤러가 여전히 메모리에있을 때 상황에 직면 한 적이 없습니다. 우리가 사용하지 않는보기의 일부 컨트롤러가 필요할 경우 메모리 사용에 좋지 않다고 생각합니다.일반적으로 뷰가 꺼지면 제어기가 삭제됩니다. 필요한 모든 것이 데이터 모델에 있고 필요할 때 다시 복원 할 수 있기 때문입니다. 그래서 우리가 viewWillDisappear에서 관찰자를 지우면 우리는 우리의 기억을 부정확하게 사용하게됩니다. –

+1

@MatrosovAlexander, 푸시 또는 모달 프레젠테이션을 수행하면 푸시 또는 모달 프레젠테이션을 수행하면 메모리에있는 컨트롤러 (푸시 한 프레젠테이션 컨트롤러 또는 프레젠테이션보기 컨트롤러)가 보이지만 화면이 꺼지는 컨트롤러가 있습니다. 실제로 이것은 매우 일반적입니다 상태. – rdelmar

+0

그래, 이해가되지만 어떤 경우에는 좋지 않다. 컨트롤러를 여러 번 눌러서 내 앱이 작동을 멈추게한다. –

관련 문제