同事写了一个clean方法,但是却发现data并没有清空
local UserLevel = class('UserLevel')
local instance_ = nil
function UserLevel:getInstance()
if instance_ == nil then
instance_ = UserLevel:create()
end
return instance
end
-- lazy的方式创建data
funcion UserLevel:getData()
if self.data == nil then
self.data = {level = 1}
end
end
function UserLevel:clean()
self.data = nil
print(tostring(self.data)) --此处打印可能不为nil
end
Bug是clean方法没有起作用,print的输出不为nil,看起来不太可能啊,但是确实是有可能的。
调用getData()存在两种方式
--错误的方式,data属性将会写到class属性中
UserLevel:getData()
--正确的方式
UserLevel:getInstance():getData()
如果使用了错误的方式调用了一次,又使用了正确的方式调用一次,self.data将会在class和instance_中存在,那么self.data被赋值为nil仅仅修改了instance_的data,由于class是instance_的metadata,再次调用self.data会索引class的data。
网友评论