关于单例的一些坑

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


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

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方法。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值