Should I set everything nil in my OOP class?

I am making this projectile system but I don’t know if I should set every value in the table to nil when I am done with it, I know that I should destroy it but I don’t know whether to set my values in the self table nil so they don’t make my game lose memory.

Module script of projectile:

local Debris = game:GetService("Debris")
local RunService = game:GetService("RunService")
local numTable = {
	CFrame.new(-2,0,-1),
	CFrame.new(2,0,-1),
}

local CD = 3

local Projectile = {}
Projectile.__index = Projectile
function Projectile.new(root)
	local self = setmetatable({},Projectile)
	self.Ball = script.Ball:Clone()
	self.IK = Instance.new("IKControl")
	self.LV = Instance.new("LinearVelocity")
	self.VF = Instance.new("VectorForce")
	self.Root = root
	self.RandomNumber = math.random(1,#numTable)
	return self
end

function Projectile:HandleKinematics()
	self.IK.Type = Enum.IKControlType.Transform
	self.IK.ChainRoot = self.Root.Parent.UpperTorso
	if self.RandomNumber == 1 then
		self.IK.EndEffector = self.Root.Parent.LeftHand
	elseif self.RandomNumber == 2 then
		self.IK.EndEffector = self.Root.Parent.RightHand
	end
	self.IK.Target = self.Ball
	return self.IK
end

function Projectile:HandleVelocity()
	self.LV.Attachment0 = self.Ball.Attachment
	self.LV.VectorVelocity = self.Ball.CFrame.LookVector * 50
	self.LV.MaxForce = 1e6
	self.LV.Parent = self.Ball
	return self.LV
end

function Projectile:HandleForce()
	self.VF.Attachment0 = self.Ball.Attachment
	self.VF.Force = Vector3.new(0,workspace.Gravity * self.Ball:GetMass(),0)
	self.VF.ApplyAtCenterOfMass = true
	self.VF.Parent = self.Ball
	return self.VF
end

function Projectile:HandleBall()
	self.Ball.CFrame = self.Root.CFrame * numTable[self.RandomNumber]
	self.Ball.Parent = workspace
end

function Projectile:Init()
	self:HandleBall()
	local VF = self:HandleForce()
	local LV = self:HandleVelocity()
	local IK = self:HandleKinematics()
	task.spawn(function()
		VF.Parent = self.Ball
		IK.Parent = self.Ball
		task.wait(.25)
		LV.Parent = self.Ball
		Debris:AddItem(IK,.1)
		Debris:AddItem(VF,CD)
		Debris:AddItem(LV,CD)
		Debris:AddItem(self.Ball,CD)
	end)
end

return Projectile

No, you don’t have to clear any entries by hand. Make sure you disconnect any active connections and destroy instances once they are no longer needed. Beyond that, losing reference to the object (self) by setting the variable to nil or something else is enough.

For easier cleanup I recommend getting a library like Maid, Janitor, or Trove.

Side suggestion

Debris is in the class of older services that use legacy wait(). For better performance rely on task.delay(). Calling Destroy() on an alredy destroyed instance won’t raise any errors.

task.delay(delayTime, function() instance:Destroy() end)
-- or
task.delay(delayTime, instance.Destroy, instance)
4 Likes

I’ll make sure to follow that tip on Debris next time thanks!

1 Like

why is that even a library name :what:

If anyone else sees this thread I also think this would be good info.

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.