首先呢,再次声明,此博文仅限于记录自己的问题。不提供给读者阅读,因为可能语言比较粗糙,问题也比较简单。
其实呢,问题主要是在于自己对单例理解的不够透彻。总所周知,单例的几种写法,其实都很简单。这里可以随便贴几种不同的写法。上代码:
1:官方的写法: PS,比较古老的写法
- static
AccountManager *DefaultManager = nil; -
- +
(AccountManager *)defaultManager { -
if (!DefaultManager) DefaultManager = [[self allocWithZone:NULL] init]; -
return DefaultManager; - }
- +
(PHFilterDropBoxView *)sharedInstance - {
-
static PHFilterDropBoxView *engineInstance = nil; -
static dispatch_once_t pred; -
dispatch_once(&pred, ^{ - engineInstance = [[self alloc] init];
-
}); -
return engineInstance; - }
好吧。代码贴完了。现在将问题。遇到的问题有几个,第一是我抽离的分类本身是没有使用单例的,因为一开始习惯了直接用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方法。