Could the EXC_BAD_ACCESS error be caused by something other than dereferencing a pointer to memory that has been released?
Yes. That error simply means that your program tried to dereference a pointer that refers to a location that your program isn't allowed to access. That could be because it points to an object that no longer exists, but it can also happen when you use a pointer without setting it to something valid in the first place, or when you incorrectly try to use a non-pointer value as a pointer.
Should I always expect to get Zombies in this case when there is an EXC_BAD_ACCESS error?
No, NSZombieEnabled only helps you find cases where you're trying to access a deallocated object. It won't help you with other cases that produce EXC_BAD_ACCESS.