美文网首页闻道丶iOS(尝鲜版)程序员上海恩美路演
关于使用单例的一些坑--很浅但是不容易发现的坑

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

作者: 李筱野 | 来源:发表于2017-03-26 16:17 被阅读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.

相关文章

网友评论

  • 30fce8c9bd42:说了这么多,原因只有一个,你那是单例吗,写错了兄弟
    李筱野:@Jack_Wong 刚仔细看了一下 的确是写错了 贴代码的时候贴错了
    李筱野:你可以去打印一下你对象的地址 就可以看出来区别了
    李筱野:@Jack_Wong 兄弟你告诉我哪写错了?是因为我没贴static xxxx *instance吗
  • 991aaa4f3361:为什么是一种写法会初始化不同的单例对象啊
    991aaa4f3361:@李筱野 哦哦。我感觉,第一种我觉得你是写错了。。。。
    +(instancetype)shareInstance
    {
    static Object *instance;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
    instance = [[Object alloc]init];
    });
    return instance;
    }
    第二种写法我觉得有点太复杂了。。。。
    李筱野:@WDXWH 你可以去试一下,其实看似是一种写法,但是第一种相当于init了一个新的,但是第二种是copy它的内存

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

本文链接:https://www.haomeiwen.com/subject/gojkottx.html