美文网首页闻道丶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.

    相关文章

      网友评论

      • Jack_Wong:说了这么多,原因只有一个,你那是单例吗,写错了兄弟
        李筱野:@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