關(guān)于使用單例的一些坑--很淺但是不容易發(fā)現(xiàn)的坑

最近寫項(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.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,068評(píng)論 25 709
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,390評(píng)論 4 61
  • 有些話,只能放在心上,包括~ “唯獨(dú)你是不可取替”
    高國(guó)恒閱讀 241評(píng)論 0 0
  • 圖形的繪制 1.圖形設(shè)備接口GDI (Graphics Device Interface ):為一個(gè)可執(zhí)行程序,它...
    曹耀文08閱讀 144評(píng)論 3 0
  • 近一年來(lái),微商幾乎在生活中無(wú)處不在,于是乎決定來(lái)探索下微信功能和微商。 微商,你以為就是利用朋友圈銷售產(chǎn)品賣賣低成...
    任璐璐閱讀 304評(píng)論 0 0

友情鏈接更多精彩內(nèi)容