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

最近写项目,突然遇到一个问题,就是我要在一个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.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,916评论 25 708
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,196评论 4 61
  • 有些话,只能放在心上,包括~ “唯独你是不可取替”
    高国恒阅读 221评论 0 0
  • 图形的绘制 1.图形设备接口GDI (Graphics Device Interface ):为一个可执行程序,它...
    曹耀文08阅读 128评论 3 0
  • 近一年来,微商几乎在生活中无处不在,于是乎决定来探索下微信功能和微商。 微商,你以为就是利用朋友圈销售产品卖卖低成...
    任璐璐阅读 263评论 0 0