From 3e2414da6fbfd972f7ea9d911720f0c2bf1ab13f Mon Sep 17 00:00:00 2001 From: Scott Goodson Date: Sun, 27 Mar 2016 18:15:40 -0700 Subject: [PATCH] [ASInterfaceState] Fix for an edge case of exiting Visible state before node deallocation. --- AsyncDisplayKit/Details/_ASDisplayView.mm | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/AsyncDisplayKit/Details/_ASDisplayView.mm b/AsyncDisplayKit/Details/_ASDisplayView.mm index 22477a0490..f4d95b99b8 100644 --- a/AsyncDisplayKit/Details/_ASDisplayView.mm +++ b/AsyncDisplayKit/Details/_ASDisplayView.mm @@ -90,6 +90,11 @@ self.keepalive_node = _node; } else if (currentSuperview && !newSuperview) { + // Clearing keepalive_node may cause deallocation of the node. In this case, __exitHierarchy may not have an opportunity (e.g. _node will be cleared + // by the time -didMoveToWindow occurs after this) to clear the Visible interfaceState, which we need to do before deallocation to meet an API guarantee. + if (_node.inHierarchy) { + [_node __exitHierarchy]; + } self.keepalive_node = nil; }