最近寫項(xiàng)目,突然遇到一個(gè)問(wèn)題,就是我要在一個(gè)VC界面獲取數(shù)據(jù),但這個(gè)數(shù)據(jù)存在我的xmpp工具類里面,絞盡腦汁也沒(méi)想到更好的解決辦法,最后用單例解決,當(dāng)時(shí)還很開(kāi)心,但用了后發(fā)現(xiàn)值是傳過(guò)來(lái)了,但是并不能在VC界面使用.
比如我在工具類里面通過(guò)VC的單例調(diào)用VC類里面的一個(gè)方法,把label.text傳過(guò)來(lái),發(fā)現(xiàn)在VC界面我獲取的時(shí)候始終為空。
第一次我的單例是這樣寫的:
<pre>
+(instancetype) sharedToast
{
static dispatch_once_t onceToken ;
dispatch_once(&onceToken, ^{
_instance = [[BGAlarmView alloc] init] ;
}) ;
return _instance ;
}
</pre>
開(kāi)始沒(méi)有往單例的寫法上找原因,后來(lái)通過(guò)打印VC的地址,發(fā)現(xiàn)我又重新初始化了一個(gè)VC浇辜,導(dǎo)致不能使用旷余。
后來(lái)改了單例的寫法:
<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>
發(fā)現(xiàn)可以了,后來(lái)打印了一下地址發(fā)現(xiàn)是一樣的,才恍然大悟,原來(lái)在使用單例時(shí),如果想讓對(duì)象地址不變,需要copy.