关于单例的一些坑

首先呢,再次声明,此博文仅限于记录自己的问题。不提供给读者阅读,因为可能语言比较粗糙,问题也比较简单。


其实呢,问题主要是在于自己对单例理解的不够透彻。总所周知,单例的几种写法,其实都很简单。这里可以随便贴几种不同的写法。上代码:

1:官方的写法:  PS,比较古老的写法

  1. static AccountManager *DefaultManager nil;  
  2.    
  3. (AccountManager *)defaultManager  
  4.     if (!DefaultManager) DefaultManager [[self allocWithZone:NULL] init];  
  5.     return DefaultManager;  
  6. }
2:线程锁的写法:


  1. (PHFilterDropBoxView *)sharedInstance  
  2.  
  3.         static PHFilterDropBoxView *engineInstance = nil;
  4.         static dispatch_once_t pred;  
  5.         dispatch_once(&pred, ^{
  6.             engineInstance = [[self alloc] init];
  7.         });
  8.         return engineInstance;
  9. }


好吧。代码贴完了。现在将问题。遇到的问题有几个,第一是我抽离的分类本身是没有使用单例的,因为一开始习惯了直接用init方式。

然后忽然想优化一下,转变成单例。那么开始写sharedInstance

然后单例写完问题来了。我没有去看之前的老代码,直接在之前调用的基础上使用了单例调用方式。

然后运行起来发现空白。。什么都没有。那么这个时候去看代码,发现之前的代码在init里面写的是super init  按照之前的逻辑来说是没有问题的。init里面这样写,而且也可以避免了释放前多次调用的问题。  但是现在转成单例以后就出现了问题了,因为我已经sharedInstance了。不能再init了。所以出现了问题。  然后删掉这行,换成[self setFrame:frame];    这样运行。恩,没问题了。问题到了这里似乎是解决了。

正当我窃喜的时候我发现了一个警告。。。好吧。继续看


这个警告的原因想来我不说也都知道。  对的,因为我把super init删掉了。然后他说if you want returning 'self' , So at the same time you have to set the 'init'

好吧。修改状态,不让他带返回值了。到此问题解决了。虽然不知道是不是最好的解决办法。 

 总结:使用单例以后不能再在其他方法里面使用init  没有init的情况下不能返回self


这个地方还有一条要注意的是,单例最好把用户的所有情况都考虑进去。也就是重写alloc方法。因为有时候用户并不知道需要用你的sharedInstance方法。





  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以,TS 是指在 TypeScript 中实现模式的方式,通过使用类的静态属性和方法来实现。在一个类中定义一个私有的静态属性 instance,然后定义一个静态方法 getInstance,该方法返回 instance,如果 instance 不存在,则创建一个新的实并返回。这样就可以保证在整个应用程序中只有一个该类的实存在。 ### 回答2: 当谈到 TypeScript 中的模式时,它主要是指通过类创建只有一个实的对象。在 TypeScript 中,我们可以使用类的静态属性和方法来实现模式。 要创建一个 TS 类,首先,我们需要定义一个私有的静态属性来存储。将构造函数设置为私有,以防止外部直接通过 new 操作符创建新的实。然后,我们使用一个公共的静态方法来控制获取的逻辑。这个静态方法会检查实是否存在,如果存在则返回实,如果不存在则创建一个新的实并返回。 以下是示代码: ```typescript class Singleton { private static instance: Singleton; private constructor() { // 初始化 } public static getInstance(): Singleton { if (!Singleton.instance) { Singleton.instance = new Singleton(); } return Singleton.instance; } // 其他类中的方法和属性 } const instance1 = Singleton.getInstance(); const instance2 = Singleton.getInstance(); console.log(instance1 === instance2); // true,只有一个实 ``` 使用 TS 模式可以确保在整个应用程序中只有一个实存在,并且在不同的地方可以方便地访问这个实。这对于需要共享状态或资源的类非常有用,并确保整个应用程序具有一致的状态。 需要注意的是,模式可能会增加代码的复杂性和耦合度,因此在使用时需要谨慎考虑。 ### 回答3: TS模式是一种设计模式,用于确保一个类只有一个实,并提供一个全局访问点来访问该实。在TS中,可以使用类、模块或命名空间来实现。 使用类实现TS的方式是通过私有构造函数和静态方法来实现。私有构造函数用于限制外部创建新的实,静态方法则用于返回唯一的实。通过使用静态方法获取实的方式,可以确保在整个应用程序中只有一个实被创建和访问。 使用模块实现TS的方式是通过导出一个已经创建好的实,该实可以被模块中的其他文件引用。由于模块内部的代码只会执行一次,所以该方式保证了只有一个实被创建和访问。 使用命名空间实现TS的方式是通过命名空间内部的变量来存储实,通过导出一个命名空间对象来保证只有一个实被创建和访问。 TS模式的优点是可以节约系统资源,避免多次创建相同的对象。同时,它也提供了一个全局访问点,方便在任何地方使用该实。 需要注意的是,TS模式虽然可以确保只有一个实存在,但在多线程环境下可能会存在线程安全问题,需要通过加锁等方式来解决。另外,滥用模式可能会导致代码的耦合性增加,降低代码的可维护性,因此需要谨慎使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值