0

iOS 6.0부터는 viewDidUnload 메소드가 더 이상 사용되지 않습니다. iOS 6 이전에는 viewDidUnload 메소드에서 NSNotification의 Observer를 제거하는 데 사용되었습니다. 그러나 그것은 사용되지 않으므로, 나는 그것을 ReceiveMemoryWarning으로 옮겼습니다. 이제 내 앱이 메모리 부족 경고를 받으면 알림이 제거됩니다. 따라서 NSNotification에서 작성된 코드는 작동하지 않습니다.iOS 6에서 NSNotification & didReceiveMemoryWarning

누구든지이 문제를 어떻게 해결할 수 있습니까?

미리 감사드립니다.

답변

4

viewDidLoad에 옵저버를 추가했다고 가정합니다. 문제는 iOS 6에서보기가 메모리가 부족한 상황에서도 언로드되지 않는다는 것입니다. 따라서 didReceiveMemoryWarning에서 관찰자를 제거하면 viewDidLoad이 다시 호출되지 않습니다.

  • viewWillAppear에 관찰자를 추가하고 viewWillDisappear에서 제거 :

    는 당신이 선택할 수있는 두 개의 상대적으로 간단한 대안이 있습니다.

  • initXXX 방법에 옵서버를 추가하고 dealloc에서 제거하십시오. I

viewDidLoad에 관찰자를 추가하고 didReceiveMemoryWarning에서 그것을 제거하는 수 있습니다. 그러나 나중에 didReceiveMemoryWarning에서보기를 "수동으로 언로드"해야하므로 viewDidLoad이 나중에 다시 호출됩니다. 예 : 샘플 코드는보기를 강제로 언로드하는 방법에 대해서는 https://stackoverflow.com/a/15805715/1187415을 참조하십시오.

+0

답장을 보내 주셔서 감사합니다. 앱이 실행되는 동안 알림이 필요함에 따라 첫 번째 대안을 따를 수 있습니다. observer를 viewDidLoad에 추가하고 dealloc 메서드에서 제거 할 수 있습니까? 감사합니다. – iOSAppDev

+0

@iOSAppDev : 예, observer가 추가되었는지 여부는 플래그를 설정해야합니다. 왜냐하면 1) 이전에 호출 된 viewDidLoad없이 dealloc이 호출 될 수 있기 때문입니다. 2) 나중에 코드를 강제로 재 작성하여 viewDidLoad 다시 부름 받았다. 그러나 addObserver/removeObserver 호출의 수가 정확히 일치해야합니다. –

+0

당신의 의견에서 이해할 수있는 것은 isObserverRemovedForNotification이라는 하나의 플래그를 추가해야한다는 것입니다. 나는 이것을 dealloc에서 설정할 것입니다. 그래서 viewDidLoad에서 확인해 보겠습니다. if (isObserverRemovedForNotification) { // 알림을 위해 관찰자 추가 } 맞습니까? 또한 ARC로 dealloc 메소드를 작성할 수 있습니까? – iOSAppDev

0

문제는 당신이 완전히 무엇을 의미하는지 오해하고있는 것입니다. viewDidUnload의 의미입니다. 뷰가 언로드 된 경우 일 때 viewDidUnload이 호출됩니다. iOS 6 이전 버전에서보기 컨트롤러를 완료하면 뷰가 언로드되지 않습니다.. iOS 6 이전 버전에서는보기가 보통 언로드되지 않기 때문에 viewDidUnload이 실행되는 것을 볼 수없는 시간은 99 %입니다. pre-iOS 6에서는보기가 메모리 경고에 대한 응답으로 언로드되고보기가 표시되지 않습니다. iOS 6에서 유일한 변경 사항은 메모리 경고에서도 뷰가 언로드되지 않는다는 것입니다.

viewDidUnload의 동작은 iOS 6 이전 및 iOS 6에서 동일합니다. 뷰가 언로드 될 때 호출됩니다. 이 때문에 iOS 6의 코드를 변경하지 않아도됩니다. 변경 한 경우 잘못된 결과가 발생했습니다.

iOS 6 이전에는 viewDidUnload 메소드에서 NSNotification의 Observer를 제거하는 데 사용되었습니다.

당신이 다음 해야이이 dealloc에서 제거 한 viewDidLoad에 관찰자를 추가한다는 것입니다 무엇을 의미합니다. 그렇지 않으면 코드가 충돌합니다. 위에서 말했듯이 99 %의 시간이 pre-iOS 6에서보기가 언로드되지 않습니다. 일반적인 흐름은 init ->viewDidLoad ->dealloc입니다. 뷰가 중간에 언로드되지 않습니다.

옵서버를 선택적으로 viewDidUnload에서 제거 할 수도 있습니다. 뷰를로드하기 전 상태로 반환하기 때문에 좋은 생각입니다. 그러나 뷰가 다시로드 될 때 viewDidLoad이 호출되고 어쨌든 이전 상태가 덮어 쓰기 때문에 반드시 필요한 것은 아닙니다.

그래서 대답은 당신이 (필수) 모두 (옵션) viewDidUnloaddealloc에 취소해야 viewDidLoad에서 한 무엇이든 아이폰 OS 6에 대한 응답으로 아무 것도 변경하지해야합니다. iOS 6 및 iOS 6 이전 버전 모두 마찬가지입니다.

+0

답장을 보내 주셔서 감사합니다. 귀하의 대답에 따르면 viewDidLoad에 관찰자를 추가하고 dealloc 메서드에서 제거 할 수 있습니까? ARC로 dealloc 메소드를 작성할 수 있습니까? – iOSAppDev

+0

@iOSAppDev : 물론 – newacct

+0

답장을 보내 주셔서 감사합니다. – iOSAppDev