내 AppDelegate
은 활성 창 컨트롤러 목록을 유지 관리하므로 ARC가 너무 빨리 할당 취소하지 않습니다. 알림 스레드에서 취급을하는 것은 그것이 준비하기 전에 컨트롤러를 할당 해제 위험 때문에 애니메이션이 발생했을 때 창 할당 취소
- (void) windowWillClose: (NSNotification*) notification {
[self performSelectorOnMainThread: @selector(removeWindowControllerInMainThread:)
withObject: windowController
waitUntilDone: NO];
}
- (void) removeWindowControllerInMainThread: (id) windowController {
[windowControllers removeObject: windowController];
}
내가 메인 스레드를 사용 : 그래서 나는이 같은 알림 핸들러를 가지고있다.
이제는이 방법이 효과적입니다. 현재 애니메이터가 실행중인 경우는 예외입니다. 나는 어떤 곳에서 애니메이터를 사용하며, NSAnimationContext
을 통해. 나는 this QA을 보았고 대답은 받아 들일 수 없다. 잠시 기다리십시오. 애니메이션을 완성하기 만하면 정말 외설적이며 일하는 것이 보장되지 않습니다. 참으로 그렇지 않습니다. 나는 현재의 애니메이션 지속 시간보다 더 큰 지연을 가지고도 performSelector:withObject:afterDelay
을 사용해 보았고 애니메이터가 여전히 nil 오브젝트에 대해 실행되도록합니다.
이렇게 컨트롤러 정리를 수행하는 가장 좋은 방법은 무엇입니까? NSAnimationContext
을 사용하지 말고 대신 방법을 사용하는 NSAnimation
을 사용 하시겠습니까?
나는 폴링에 대한 생각이 싫지만 괜찮습니다. DRY와 관심의 분리는 이것이 창 컨트롤러가 전혀 신경 쓸 필요가없는 것이어야한다는 것을 나타냅니다. 그래서이 기능을 창 컨트롤러 기본 클래스에 패키징했습니다. –
폴링하지 않으려면 완료 핸들러에서 컨트롤러에 알림을 보냅니다. 또는 애니메이션 객체가 windowController에 대해 알고 있으면 애니메이션이 시작될 때'willAnimate' 메시지를 보내고 애니메이션이 끝날 때'didAnimate' 메시지를 보냅니다. –