SKNode removeFromParent иногда удаляет лишние дочерние элементы

Я обнаружил, что один из моих SKNodes в моей игре удаляет дополнительных дочерних узлов, когда один из его дочерних элементов вызывает removeFromParent. Чтобы убедиться в этом, я переопределил removeFromParent и добавил следующее утверждение, которое проверяет, что был удален только один дочерний элемент. Утверждение не работает:

- (void) removeFromParent {
SKNode *parent = self.parent;
NSUInteger startingCount = [self.parent.children count];
[super removeFromParent];
if (parent) {
    NSAssert([[parent children] count] == startingCount - 1, @"Wrong number of children after removing one child!");
}

}

Я подал отчет об ошибке для этого, но теперь я застрял на этом, потому что у меня нет обходного пути. Мне интересно, если кто-нибудь еще сталкивался с этим и может иметь обходной путь для этого.


person Chris Garrett    schedule 04.08.2014    source источник
comment
какого класса затронутые узлы работают под управлением removeFromParent? Вы узнали, какие дополнительные узлы были удалены?   -  person LearnCocos2D    schedule 05.08.2014
comment
Это мой собственный подкласс SKSpriteNode.   -  person Chris Garrett    schedule 05.08.2014
comment
проверьте любой код, который удаляет себя или другие узлы, вы, скорее всего, сами как-то вызываете эту проблему, потому что удаление узлов является такой фундаментальной функцией, если бы она была каким-то образом нарушена, было бы много отчетов об этом   -  person LearnCocos2D    schedule 05.08.2014
comment
Согласен - казалось бы, об этом сообщили бы раньше. Вот почему я потратил два дня, пытаясь понять, что происходит. Но это явно баг. Мой ответ ниже выглядит так, как будто это может быть недокументированная нестандартная реализация isEqual: в SKNode или SKSpriteNode.   -  person Chris Garrett    schedule 05.08.2014


Ответы (1)


Хорошо, я нашел обходной путь после догадки.

Мои дочерние узлы возвращали YES для isEqual:, хотя это были разные объекты, и я не переопределял isEqual: в моем подклассе SKSpriteNode. Кажется, что реализация removeFromParent использует isEqual:, и когда неравные узлы возвращали YES, удалялось более одного.

Мой обходной путь состоял в том, чтобы переопределить isEqual: следующим образом:

- (BOOL) isEqual:(id)object {
    return self == object;
}
person Chris Garrett    schedule 04.08.2014