闻道丶iOS(尝鲜版)程序员上海恩美路演

关于使用单例的一些坑--很浅但是不容易发现的坑

2017-03-26  本文已影响117人  李筱野

最近写项目,突然遇到一个问题,就是我要在一个VC界面获取数据,但这个数据存在我的xmpp工具类里面,绞尽脑汁也没想到更好的解决办法,最后用单例解决,当时还很开心,但用了后发现值是传过来了,但是并不能在VC界面使用.
比如我在工具类里面通过VC的单例调用VC类里面的一个方法,把label.text传过来,发现在VC界面我获取的时候始终为空。
第一次我的单例是这样写的:
<pre>
+(instancetype) sharedToast
{
static dispatch_once_t onceToken ;
dispatch_once(&onceToken, ^{
_instance = [[BGAlarmView alloc] init] ;
}) ;
return _instance ;
}
</pre>
开始没有往单例的写法上找原因,后来通过打印VC的地址,发现我又重新初始化了一个VC,导致不能使用。
后来改了单例的写法:
<pre>
+(instancetype) sharedToast
{
static dispatch_once_t onceToken ;
dispatch_once(&onceToken, ^{
_instance = [[super allocWithZone:NULL] init] ;
}) ;
return _instance ;
}

+(id) allocWithZone:(struct _NSZone *)zone
{
return [BGAlarmView sharedToast] ;
}

-(id) copyWithZone:(struct _NSZone *)zone
{
return [BGAlarmView sharedToast] ;
}
</pre>
发现可以了,后来打印了一下地址发现是一样的,才恍然大悟,原来在使用单例时,如果想让对象地址不变,需要copy.

上一篇 下一篇

猜你喜欢

热点阅读