The best way to delete custom class objects would be to remove any reference to any values inside them. For example, if your object has any references to any Instances, or uses any Instances, when the :Destroy() is called, destroy those Instances, and remove the references to those Instances.
After that, remove every single value from the table(set them to nil), and finally, set the self to nil.
After the :Destroy() call on the object, set the variable for that object to nil as well.
This way, the garbage collector will pick that object up as it has no remaining references, and clear the memory.
Setting the metatable to nil and freezing the table ensures that the object is completely unusable after it’s destroyed, which is the desired behavior. You should additionally call table.clear to clear all references to other objects that may still be inside the table.
An ideal destroy method (of course, you have to disconnect connections or call the destroy functions of any component objects before this):