文档章节

IOS单例模式(Singleton)

Jack088
 Jack088
发布于 2015/12/25 14:50
字数 511
阅读 40
收藏 0

单例模式的意思就是只有一个实例。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。

1.单例模式的要点:

  显然单例模式的要点有三个;一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。

2.单例模式的优点:

  1.实例控制:Singleton 会阻止其他对象实例化其自己的 Singleton 对象的副本,从而确保所有对象都访问唯一实例。

  2.灵活性:因为类控制了实例化过程,所以类可以更加灵活修改实例化过程

 

IOS中的单例模式

  在objective-c中要实现一个单例类,至少需要做以下四个步骤:
  1、为单例对象实现一个静态实例,并初始化,然后设置成nil,
  2、实现一个实例构造方法检查上面声明的静态实例是否为nil,如果是则新建并返回一个本类的实例,
  3、重写allocWithZone方法,用来保证其他人直接使用alloc和init试图获得一个新实力的时候不产生一个新实例,
  4、适当实现allocWitheZone,copyWithZone,release和autorelease。

下面以SurveyRunTimeData为例子:

 

static SurveyRunTimeData *sharedObj = nil; //第一步:静态实例,并初始化。
@implementation SurveyRunTimeData
+ (SurveyRunTimeData*) sharedInstance  //第二步:实例构造检查静态实例是否为nil
{
    @synchronized  (self)
    {
        if (sharedObj == nil)
        {
            [[self alloc] init];
        }
    }
    return sharedObj;
}

+ (id) allocWithZone:(NSZone *)zone //第三步:重写allocWithZone方法
{
    @synchronized  (self) {
        if (sharedObj == nil) {
            sharedObj = [super allocWithZone:zone];
            return sharedObj;
        }
    }
    return nil;
}

- (id) copyWithZone:(NSZone *)zone //第四步
{
    return self;
}

- (id) retain
{
    return self;
}

- (unsigned) retainCount
{
    return UINT_MAX;
}

- (oneway void) release
{
    
}

- (id) autorelease
{
    return self;
}


- (id)init
{
    @synchronized(self) {
        [super init];//往往放一些要初始化的变量.
        return self;
    }
}

@end

或者:

static UserEntity * _sharedInstance = nil;
+ (UserEntity*)sharedInstance
{
    static dispatch_once_t p = 0;
    dispatch_once(&p, ^{
        _sharedInstance = [[UserEntity alloc] init];
    });
    return _sharedInstance;
}

```

static id _instance;

+(instancetype)sharedApi

{

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        _instance = [[NTPayApi alloc] init];

    });

    

    return _instance;

}

```

本文转载自:http://www.cnblogs.com/lyanet/archive/2013/01/11/2856468.html

Jack088
粉丝 44
博文 512
码字总数 76218
作品 0
扬州
程序员
私信 提问
如何判断你是合格的高级iOS开发工程师?

前言 随着移动互联网的高速发展泄洪而来,有意学习移动开发的人越来越多了,竞争也是越来越大,需要学习的东西很多。如何才能在激烈的移动开发者竞争中一枝独秀,成为一名真正合格的高级iOS...

_小迷糊
2018/05/26
0
0
移动开发之设计模式- 代理模式(IOS&Android)

资源 完全参照 代理模式|菜鸟教程但不包括IOS代码 代理模式 在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。 在代理模式中,我们创建具有现有...

FlanneryZJ
2018/12/18
0
0
移动开发之设计模式-工厂模式(IOS&Android)

资源 完全参照 工厂模式|菜鸟教程 ,但不包括IOS代码 工厂模式 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳...

FlanneryZJ
2018/12/17
0
0
移动开发之设计模式- 命令模式(IOS&Android)

资源 完全参照 命令模式|菜鸟教程但不包括IOS代码 命令模式 命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用...

FlanneryZJ
2018/12/19
0
0
移动开发之设计模式-抽象工厂模式(IOS&Android)

资源 完全参照 抽象工厂模式|菜鸟教程 ,但不包括IOS代码 抽象工厂模式 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型...

FlanneryZJ
2018/12/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

全面剖析 Knative Eventing 0.6 版本新特性

前言 Knative Eventing 0.6 版本已经于5月15号正式发布。相比于0.5版本,此次发布包含了一些重要特性及更新。针对这些新特性以及更新,我们如何快速、精准的定位主要技术点。本篇文章针对这些...

阿里云官方博客
3分钟前
0
0
在闲鱼,我们如何用Dart做高效后端开发?

背景 像阿里其他技术团队以及业界的做法一样,闲鱼的大多数后端应用都是全部使用java来实现的。java易用、丰富的库、结构容易设计的特性决定了它是进行业务开发的最好语言之一。后端应用中数...

阿里云云栖社区
5分钟前
0
1
初学Docker容器网络不得不看的学习笔记

【技术沙龙002期】数据中台:宜信敏捷数据中台建设实践|宜信技术沙龙 将于5月23日晚8点线上直播,点击报名 一、关于Docker Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0...

宜信技术学院
7分钟前
1
0
Django框架配置

今天我们学习Django框架配置,首先先来看一下如何在Django中创建APP! 1.Django中创建APP 首先我们打开PyCharm,找到之前你创建的Django项目,我的项目是First_Project: (1)先选中你要运行...

彩色泡泡糖
9分钟前
0
0
git代码迁移

一、从阿里云code迁移到gitLab 1、在gitLab上新建一个项目Bicon,添加私钥 2、从原地址克隆一份裸版本库 git clone --bare git://xxxx_Bicon.git 这里的地址是阿里云code的地址 3、以镜像推送...

星爵22
10分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部