This is a late response - so if it's solved already just tell me to shut up.
I can't make sense of what you are trying to do in your code at all - but what I would do:
IN the touches began, store the location of the touch in some property somewhere (maybe in the layer?) and do not more processing in the touchesbagen method.
Somewhere (maybe in the Layer->update() method):
int index = 0;
bool hitZombie= false;
while (index < zombiearray.length() && !finished)
{
zombie = zombieArray[index];
if (zombie.x < touch.x && zombie.x + zombie.width > touch.x
&& zombie.y < touch.y && zombie.y + zombie.height > touch.y)
{
handleZombieBeingTouched(zombie);
hitZombie= true;
}
index ++
}
if (!hitZombie)
{
handleNoZombieHit();
}
There's you really need to do - like storing touch as an array so lots of fast touches are handled,
but the above would probably give you the basics