2013-05-25 1 views
2

UIView 애니메이션 블록에서 이상한 경험을했습니다.iOS가 UIView 애니메이션 완성 블록을 정리하지 않습니까?

내 애니메이션 코드를 실행 한 후 결코 해제하지보기. 애니메이션 코드를 호출하기 전에 view 속성을 nil로 설정했습니다. 그런 다음 완료 블록 내에서 슈퍼 뷰에서 제거한 후 페이드 아웃 한 후 사라졌습니다.

는하지만 그 -dealloc은 페이드 아웃 및 제거보기는 호출되지 않습니다. 그런 다음 완성 된 블록이보기를 유지하고 작동하는 __weak을 사용하여 약한 참조를 만든 것 같습니다. 갑자기 애니메이션 완료 후보기가 제대로 할당 취소되었습니다.

그러나 애니메이션 블록 자체

나는 단순히 뷰를 참조하고 뷰의 할당 해제 제대로 0으로 여전히 __weak 참조 및 알파를 설정합니다.

결론 : iOS는 애니메이션이 완료된 후 애니메이션 블록을 정리합니다. 그러나 완료 블록을 정리하지는 않습니다. 의미 : __weak 참조는 완료 블록의 모든 항목에 대해 영원히 사용되므로 사용해야합니다.

은 모든 강한 참조를 해제 있도록 작업을 종료 한 블록 폐기 또는 정리를 트리거 할 수있는 마법의 방법이 있나요? 물론 ARC btw를 사용합니다.

+1

귀하의 결론이 잘못되었음을 이미 알고 계시길 바랍니다. Caleb가 메모리 누수로 이끄는 완성 블록에 대한 강력한 참조를 'self'가 가진다면 * Caleb가 제안한대로주기를 유지할 수 있습니다. 그러나 이것은 표준'+ [UIView animate ...] 메소드를 사용하는 경우에는 발생하지 않습니다. 코드를 게시 할 경우에만 더 도움을 줄 수 있습니다. – Mar0ux

답변

1

블록에서 강력한 참조를 사용하여 의도하지 않게 보관주기를 생성 한 것 같습니다. 뷰는 블록에 대한 강력한 참조를 가지며 블록은 뷰에 대한 강력한 참조를 가지며 상호 강력한 참조는 어느 하나가 할당 해제되지 못하게합니다. 블록의 참조를 weak로 변환하면 뷰가 (그리고 결국 블록이) 할당 해제되도록하는 사이클이 깨졌습니다. ARC, ivars in Blocks and Reference Cycles via Captured Self을 :

는이 SO 질문 블록의 사이클을 유지 생성의 가능성의 좋은 토론을 찾을 수 있습니다.

+0

아니, 그 블록을 전혀 참조하지 않았습니다. 그냥 그것을 애니메이션 메서드에 대한 인수로 전달했습니다. – openfrog