Just a tiny note, on that one line:
if (b->GetPosition().y * PTM_RATIO < -10)
You'll want to check the radius of the object instead of -10.
I'm sure badawe was just giving a generic example, but something to keep in mind.
AtlasSprite* sprite = (AtlasSprite*) b->GetUserData();
float objectRadiusInb2World = [sprite contentSize].width * sprite.scale / 2 / PTM_RATIO;
// Now check
if (b->GetPosition().y * PTM_RATIO < -objectRadiusInb2World)
sprite._markForDeletion = YES;
If you're deleting the body in the current loop, be sure you've already set you're 'b' pointer before it happened, otherwise the linked-list chain of bodies will be broken and your next iteration will crash.
Oneday,
http://littlephysics.com