如果单例没有被调用,它们会分配内存吗?例如:
public class CameraShake : MonoBehaviour
{
// Make it singleton
#region Singleton
public static CameraShake instance { get; private set; };
private void Awake()
{
if (instance == null)
instance = this;
}
#endregion
public void Function() {// Code here...}
}
如果我们没有在某个地方调用它,它会分配内存吗?
您在这里使用的是 MonoBehaviour,而不是“真正的”单例。 “真正的”单例是在启动时(或某个初始化阶段)或在需要时使用“延迟初始化”创建的。单例也不是静态类。它的创建方式与静态类不同,因此任何有关静态类的规则都不适用于此处。 但是由于您使用的是 MonoBehaviour,您正在使用由 Unity 创建的托管对象并将对其的引用存储为静态引用。为了使这个单例存在并且使
instance
永远有效,您必须以某种方式将其添加到
GameObject
(在编辑器中或在 AddComponent<T>()
上使用 GameObject
。因此,为了使对象的单例部分存在,需要事先有一个实例,然后由 Unity 调用 Awake()
。因此,您的对象将始终分配内存,无论您是否通过静态成员访问它。如果您在应用程序生命周期中的任何时候都没有创建内存,它就不会分配内存,但这与单例方面完全无关,只是您没有在引擎中生成对象。
静态构造函数仅被调用一次,静态类在程序所在的应用程序域的生命周期内保留在内存中。
我不是内存分配方面的专家,但这对我来说似乎很清楚。
编辑:即使在您的示例中,
CameraShake
不是静态类,我也会再次引用文档。
因此,创建静态类与创建仅包含静态成员和私有构造函数的类基本相同。私有构造函数会阻止类被实例化。使用静态类的优点是编译器可以检查以确保没有意外添加实例成员。编译器保证无法创建此类的实例。