When Is This Script Destroyed?

Hi, currently in my game I can only play one level once because when I reload the scene it appears this error:
“MissingReferenceException: The object of type ‘PlatformManager’ has been destroyed but you are still trying to access it.
Your script should either check if it is null or you should not destroy the object.”

When do I destroy this object in script? I’ve checked it hundreds of times and don’t see where is the error, can someone help me?

Script:

using UnityEngine;
using System.Collections.Generic;

public class PlatformManager : MonoBehaviour {

	public Transform prefab;
	public int numberOfObjects;
	public float recycleOffset;
	public Vector3 minSize, maxSize, minGap, maxGap;
	public float minY, maxY;
	public Material[] materials;
	public PhysicMaterial[] physicMaterials;
	public Booster booster;
	public Jumper jumper;
	public Teleporter teleporter;
	public Braker braker;
	public Saver saver;
	public Twister twister;

	private Vector3 nextPosition;
	private Queue<Transform> objectQueue;
	
	void Start () {
		GameEventManager.GameStart += GameStart;
		GameEventManager.GameOver += GameOver;
		objectQueue = new Queue<Transform>(numberOfObjects);
		for(int i = 0; i < numberOfObjects; i++){
			objectQueue.Enqueue((Transform)Instantiate(prefab, new Vector3(0f, 0f, -100f), Quaternion.identity));
		}
		enabled = false;
		
		nextPosition = transform.localPosition;
		for(int i = 0; i < numberOfObjects; i++){
			Recycle();
		}
	}

	void Update () {
		if(objectQueue.Peek().localPosition.x + recycleOffset < PlayerPrefs.GetInt("Distance")){
			Recycle();
		}
	}

	private void Recycle () {
		Vector3 scale = new Vector3(
			Random.Range(minSize.x, maxSize.x),
			Random.Range(minSize.y, maxSize.y),
			Random.Range(minSize.z, maxSize.z));

		Vector3 position = nextPosition;
		position.x += scale.x * 0.5f;
		position.y += scale.y * 0.5f;
		booster.SpawnIfAvailable(position);
		jumper.SpawnIfAvailable(position);
		teleporter.SpawnIfAvailable(position);
		braker.SpawnIfAvailable(position);
		saver.SpawnIfAvailable(position);
		twister.SpawnIfAvailable(position);

		Transform o = objectQueue.Dequeue();
		o.localScale = scale;
		o.localPosition = position;
		int materialIndex = Random.Range(0, materials.Length);
		o.renderer.material = materials[materialIndex];
		o.collider.material = physicMaterials[materialIndex];
		objectQueue.Enqueue(o);

		nextPosition += new Vector3(
			Random.Range(minGap.x, maxGap.x) + scale.x,
			Random.Range(minGap.y, maxGap.y),
			Random.Range(minGap.z, maxGap.z));

		if(nextPosition.y < minY){
			nextPosition.y = minY + maxGap.y;
		}
		else if(nextPosition.y > maxY){
			nextPosition.y = maxY - maxGap.y;
		}
	}
	
	private void GameStart () {
		nextPosition = transform.localPosition;
		for(int i = 0; i < numberOfObjects; i++)
		{
			Recycle();
		}
		enabled = true;
	}
	
	private void GameOver () {
		enabled = false;
	}
}

When you load a new scene, any prefabs you have set for the previous scene will be destroyed. Read this to understand how to stop an object from destroying on scene load.