前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >单例设计模式

单例设计模式

作者头像
用户1941540
发布2018-05-11 11:30:31
5800
发布2018-05-11 11:30:31
举报
文章被收录于专栏:ShaoYL

单例设计模式

基本概念

单例设计模式运用较为普遍、广泛且较为简单的设计模式之一,它的设计原理是始终返回一个实例,即一个类始终只有一个实例。

创建单例的基本步骤

  • 声明一个单例对象的静态实例
  • 创建一个类的类工厂方法,生成一个该类的实例,当且仅当这个类的实例为nil时。
  • 覆盖 allocWithZone: 方法,确保用户程序员在直接分配和初始化对象时,不会产生另一个对象。
  • 实现 NSCopying 协议,覆盖 release,autorelease,retain,retainCount 方法,以此确保单例的状态。
  • 在多线程的环境中,注意使用@synchronized 关键字,确保静态实例被正确的创建和实例化。

单例基本实现

代码语言:javascript
复制
static UserContext *segtonInstance = nil;

@implementation UserContext

+(id)shareUserContext{
    @synchronized(self){
        //线程安全
        if (segtonInstance == nil) {

            segtonInstance = [[[self class] alloc] init];
        }
    }
    return segtonInstance;
}

//重写 allocWithZone: 方法
+(id)allocWithZone:(NSZone *)zone{
    if (segtonInstance == nil) {
        segtonInstance = [super allocWithZone:zone];
    }
    return segtonInstance;
}

- (id)copyWithZone:(NSZone *)zone
{
    return segtonInstance;
}
代码语言:javascript
复制
//覆盖 release,autorelease,retain,retainCount 方法方法

//返回本身
-(id)retain
{
    return self;
}

-(NSInteger)retainCount
{
    return UINT_MAX;
}

-(id)autorelease{
    return self;
}
-(oneway void)release
{

}
代码语言:javascript
复制
//验证单例
  UserContext *user1 = [UserContext shareUserContext];
        UserContext *user2 = [UserContext shareUserContext];
        UserContext *user3 = [[UserContext alloc] init];
        UserContext *user4 = [[UserContext alloc] init];
        UserContext *user5 = [[UserContext copy];

        NSLog(@"%@",user1);
        NSLog(@"%@",user2);
        NSLog(@"%@",user3);
        NSLog(@"%@",user4);
        NSLog(@"%@",user5);
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015-06-18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档