iOS开发单例类使用

开发中使用单例是在普通不过的一件事了,但是在使用时需要注意一些问题。很多时候我们都是习惯性的“拿来主义”——参考别人已有的代码直接用。没有去深究,往往在真出了问题之后才会注意到。

单例的销毁

一个单例创建很容易,但是销毁呢?单例为什么要销毁?准确的来说不是销毁,是置空属性。比如一个User的单例类,当用户退出登录后,里边的属性是要全部清理掉的。最一般的想法就是把单例的[User shareInstance]=nil,然后重新创建。但是这种办法无效。是的这种方法无效。技术上讲[User shareInstance]=nil这句代码会报不可赋值的错误。这个时候可能会自作聪明的声明一个变量引用它,然后变量在设置为nil。这里犯了想当然的指针和对象关系的错误。局部变量设置为nil就是不引用对象而已,不影响单例对象。正确的做法,需要实现一个方法,这样就需要把onceToken设置为全局变量了。也可以设置一个seNil方法,将单例类所有属性值置空

 static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        
    });
+ (void)setNil
{
    instance = nil;
    onceToken = 0;
}

单例类创建

单例类的创建需要考虑的问题有,只创建一次线程安全类的构造方法创建对象返回单例类类的拷贝返回单例类
一般 dispatch_once(&onceToken, ^{});的做法保证了只创建一次和线程安全。类似于java风格的判断实例是否为nil的方法需要加上@synchronized{}保证线程安全。
重写allocWithZone和copyWithZone保证了后两者。不过一般注意的话,不需要这样。这样做严谨一些。

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

推荐阅读更多精彩内容

  • 单例模式 什么是单例模式? 单例模式想一个大独裁者,他规定在他的国度里面,所有数据的访问和请求都得经过他,甚至你要...
    GitHubPorter阅读 1,199评论 0 4
  • 218.241.181.202 wxhl60 123456 192.168.10.253 wxhl66 wxhl6...
    CYC666阅读 1,473评论 0 6
  • coding 的演示功能不让用,原来搭建的博客访问不了了。索性将全部博客迁移到简书,这篇是旧文章,欢迎大家以后来简...
    小笨狼阅读 869评论 0 14
  • 经常用到单例,但也仅仅是停留在会用的层次,至于为什么这么用,内部怎么实现的,从未研究过。在面试的时候,被问到了单例...
    YSL一路行走阅读 2,613评论 5 29
  • 写作是令人快乐的,因为写作源于生活。 为何发出这样的结论?写作,并不是你们理解的那样,不是说写散文写小说就叫写作,...
    宋泽珏阅读 443评论 8 6