getChildByTag никогда не завершится сбоем, это довольно хорошо закодированный метод, который просто перебирает массив дочерних объектов объекта и проверяет, совпадают ли какие-либо объекты, таким образом, вы не получаете проблем с утверждениями.
Выу вас есть серьезные проблемы с вашим кодом.
Во-первых ..
GameLayer *heroInstance = [[GameLayer alloc] init];
CCSprite *hero = (CCSprite *)[heroInstance getChildByTag:1];
NSLog(@"Hero position X: %f", hero.position.x);
NSLog(@"Hero position Y: %f", hero.position.y);
Это никогда не сработает, heroInstance - совершенно новый объект, у него нет детей, также вы только что создалиутечка памяти здесь.
Ваш герой является дочерним элементом спрайт-листа, который является дочерним элементом сцены.
Чтобы сослаться на своего ребенка, вы должны вызвать getChildByTag в своем спрайт-листе (который вам, вероятно, нуженчтобы ссылаться, вызывая getChildByTag на вашей сцене ..
как-то так.
[[self-getChildByTag: spritesheet] getChildByTag: hero];
Также используйте перечисление,чтобы вам не приходилось запоминать, какими номерами являются определенные теги (посмотрите примеры проектов cocos2d).