How to fix MissingReferenceException after a scene reload?

I have a scene which i reload and everything seems to work fine, however i get the error: MissingReferenceException: The object of type ‘UnityEngine.SpriteRenderer’ has been destroyed but you are still trying to access it when one one of the grids tilespriterenderers referenced

A bit of context is that i have a battleships style game with 2 grids with 2 gridmanager scripts which create their own tile prefabes and order them into their grid form attaching a “tile” script to them to manage their individual state + properties + onclick, ect.

The gridmanager + tile scripts are the same for each with them just having different instances of them and after a scene reload one works perfectly fine however the other has this issue.

I think i’ve tracked down a cause to being that for one of the grids all the tileScripts refer to themselves as “null” when “this” is used which doesn’t make much sense to me as how can an instance which is null be called when it’s null??

Futhermore it works perfectly fine for one instance of the identical script + no issues for other methods in the tile which reference the exact same thing UpdateTileColour (the issue code) does

Some of the code:

**Code where error occurs:** 

    public void UpdateTileColour(Color color)
    {
        tileColour = color;
        Debug.Log($"UpdateTileColour: Updating tile: {this} at row: {row}, column: {col} colour to: {color}");
        TileSpriteRenderer.color = color;
    }

**Code which calls this code:**

public int OnTileHit(Tile tile) // OnTileHit function. Does immediate validation of hit
{
    if (!tile.IsPreviouslyHit) // makes sure the tile hasn't been hit before + validating it's the entities turn
    {
        Debug.Log($"Tile: {tile} hit at: Row: {tile.row} Column: {tile.col}"); // This returns Tile == Null in 
        debug log

        tile.IsPreviouslyHit = true; // sets the isHit variable to true to signifiy it has already been clicked

        if (tile.IsBunker) // If tile's a bunker 
        {
            OnBunkerHit(tile);
            GeneralBackgroundLogic.ChangeTurn();
            return 0; // returns true to signify that the method completed successfully 
        }
        else // if tile's not a bunker 
        {
            OnBunkerMiss(tile);
            GeneralBackgroundLogic.ChangeTurn();
            return 0; // returns true to signify that the method completed successfully
        }
        
    }
    else if (tile.IsPreviouslyHit) // The tile has already been hit
    {
        return 1; // Returns 1 to signify that the method failed to complete as tile's already hit
    }
    else // Its not the entities turn
    { 
        return 2; // Returns 2 to signifiy method failed to complete as it's not the entities turn
    }
}

public void OnBunkerHit(Tile tile) // function called when a tile with a bunkers been hit (validation already done)
{
    Debug.Log($"OnBunkerHit: Determined tile was a bunker"); 

    tile.UpdateTileColour(_hitColour); // Changes the tiles colour to its hitColour

    DecrementBunkerCount(tile);
}

public void OnBunkerMiss(Tile tile)
{
     Debug.Log($"OnBunkerMiss: Determined tile wasn't a bunker"); // outputs into the unity console 
     that it's identified cell has been clicked. (for debugging + testing purposes)
     tile.UpdateTileColour(_missColour); // changes the tiles colour to blue to indicate miss
}

**Rest of tile class:**

public class Tile : MonoBehaviour
{ 
    public int row; // row position of tile
    public int col; // column position of the tile

    // Tile state variables
    public bool IsBunker = false;  // checks if the tile has a bunker
    public bool IsRotated = false; // sets the rotation status of the tile (false by default)
    public bool isPreviouslyHit;

    public GridManager GridManager;  // creates a reference to the gridmanager script
    private SpriteRenderer tileSpriteRenderer;

    private Color tileColour;

    public void Initalise(int rowRef, int colRef, GridManager gridManagerRef)
   {
       row = rowRef; // sets the classes row varaible to equal the inputted row from when called
       col = colRef; // sets the classes col variable to equal the inputted row from when called
       GridManager = gridManagerRef; // sets the gridmanager variable == the inputted grid manager 
       script
      tileSpriteRenderer = GetComponent<SpriteRenderer>(); // Sets the tiles sprite renderer to the one 
      attached to it
      Debug.Log($"Initialise: Tile {this} at row: {rowRef}, {colRef} initialized. Rows == {row}, Columns == 
      {col}, TileSpriteRenderer == {TileSpriteRenderer}"); **// Outputs successfuly with tile being 
      initialized and outputting a reference to the tile (not null)**
 }

 protected void Start()
 {
     TileColour = TileSpriteRenderer.color;
 }

 protected void OnMouseOver() // Automatically called by unity if tile's hovered over. Temporaraly makes the tile more transparent
 {
     Color tempColor = TileColour;  // Gets the sprites current colour
     tempColor.a = 0.5f; // Changes the alpha of the sprites colour colour to 125 (more transparent)
     TileSpriteRenderer.color = tempColor; // Commits the new sprite colour with modified alpha 
     (transparency)
 }

 protected void OnMouseExit() // Automatically called if tile's no longer being hovered over. Sets the tile back to its regular colour
 {
     TileSpriteRenderer.color = TileColour;
 }

}

The really strange part to me is that OnMouseOver + OnMouseExit still work fine changing the tile’s transparency when the mouse is hovered over but UpdateTileColour doesn’t work outputting an error.