最近写项目,突然遇到一个问题,就是我要在一个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.
网友评论
+(instancetype)shareInstance
{
static Object *instance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[Object alloc]init];
});
return instance;
}
第二种写法我觉得有点太复杂了。。。。