单例正确写法

#import "Singleton.h" 
@implementation Singleton 
static Singleton* _instance = nil; 
+(instancetype) shareInstance 
{
     static dispatch_once_t onceToken ;                dispatch_once(&onceToken, ^{ 
     _instance = [[super allocWithZone:NULL] init] ; }) ; return _instance ; 
 } 
-(id) copyWithZone:(struct _NSZone *)zone 
{ 
    return [Singleton shareInstance] ; 
} 
@end
### Unity中模式的正确实现方式 在Unity开发中,模式是一种常见的设计模式,用于确保某个类仅有一个实并提供全局访问点。以下是几种常见且推荐的模式实现方式。 #### 方法一:基于`Awake`方法的传统模式 这种方法是最基础也是最常见的模式实现方式之一。通过重写`Awake`方法,在对象初始化时设置静态变量来保存唯一的实[^1]。 ```csharp public class Singleton : MonoBehaviour { public static Singleton Instance; private void Awake() { if (Instance == null) { Instance = this; DontDestroyOnLoad(gameObject); } else { Destroy(gameObject); } } } ``` 此方法的优点在于其实现简明了,适合大多数场景下的需求。然而需要注意的是,当多个脚本同时继承此类时可能会引发冲突,因此需谨慎处理多线程或多组件的情况。 #### 方法二:带懒加载功能的安全模式 为了防止重复创建以及提高性能效率,可以采用更安全的方式构建模式。这种方式会在首次请求该实时才真正去实化它,并利用私有构造函数阻止外部直接实化[^2]。 ```csharp public sealed class PlayerSingletonMono : MonoBehaviour { private static PlayerSingletonMono _instance; public static PlayerSingletonMono Instance { get { if (_instance == null) { GameObject singletonObject = new GameObject("PlayerSingletonMono"); _instance = singletonObject.AddComponent<PlayerSingletonMono>(); DontDestroyOnLoad(singletonObject); } return _instance; } } // 私有的构造函数以避免被其他地方实化 private PlayerSingletonMono() {} public int Health { get; set; } } ``` 这种做法不仅能够有效减少不必要的资源消耗,还增强了代码健壮性与可维护性。 #### 方法三:考虑生命周期管理的改进型模式 考虑到某些特殊情况下可能需要销毁当前存在的对象然后再重新生成新的情况,可以在原有基础上增加额外逻辑支持动态控制其生命期[^3]。 ```csharp public abstract class BaseManager<T> : MonoBehaviour where T : Component { private static T _instance; public static T Instance { get { if (_instance == null || !_instance.gameObject.activeInHierarchy) { var objs = FindObjectsOfType(typeof(T)) as T[]; if (objs.Length > 0 && !objs[0].Equals(null)) _instance = objs[0]; else { Debug.LogWarning($"No active instance of type {typeof(T)} found."); GameObject obj = new GameObject($"{typeof(T).Name} Manager"); _instance = obj.AddComponent<T>(); DontDestroyOnLoad(obj); } } return _instance; } } } // 使用示 public class GameManager : BaseManager<GameManager> { // 游戏管理具体业务逻辑... } ``` 上述代码片段展示了如何定义一个通用的基础管理者基类 `BaseManager<T>` ,从而让任何派生自它的子类都可以轻松获得行为的同时也具备更好的扩展能力。 关于调用过程中涉及的自动加载机制问题,实际上是因为C#反射技术的缘故使得即使从未显式声明过某类型的实也可以触发相应操作流程完成初始化工作[^4] 。不过对于特定场合下希望延迟至实际需要用到的时候再去分配内存空间的话,则应该选用带有惰性求值特性的版本如第二种所示那样去做比较好一些。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值