Destroying assets is not permitted to avoid data loss "list" code example

Example: destroying assets is not permitted to avoid data loss

This is because the variable obstacle is referencing the asset.
What you need to do, is change

Instantiate(obstacle, new Vector3(x * 7.5f, y, z),Quaternion.identity);

to

obstacle = (GameObject) Instantiate(obstacle, new Vector3(x * 7.5f, y, z),Quaternion.identity);

Instead of destroying the instantiated object you were trying to destroy,
you were actually attempting to destroy the original due to not assigning 
obstacle as the instantiated object.