在之前的一片文章中介绍了对象的拷贝相关知识:http://blog.csdn.net/jiangwei0910410003/article/details/41926531,今天我们来看一下OC中的单例模式,单例模式在设计模式中用的可能是最多的一种了,而且也是最简单的一种

实现单例模式有三个条件

1、类的构造方法是私有的

2、类提供一个类方法用于产生对象

3、类中有一个私有的自己对象

针对于这三个条件,OC中都是可以做到的

1、类的构造方法是私有的

我们只需要重写allocWithZone方法,让初始化操作只执行一次

2、类提供一个类方法产生对象

这个可以直接定义一个类方法

3、类中有一个私有的自己对象

我们可以在.m文件中定义一个属性即可

下面来看代码:

AdressBook.h

//
// AdressBook.h
// 35_Singleton
//
// Created by jiangwei on 14-10-13.
// Copyright (c) 2014年 jiangwei. All rights reserved.
// #import <Foundation/Foundation.h> //设计单利类的目的,限制这个类只能创建一个对象 //构造方法为私有的
//保存一个全局的static变量
@interface AdressBook : NSObject + (AdressBook *)shareInstance; @end

在.h文件中提供了一个类方法,用于产生对象的

AdressBook.m

//
// AdressBook.m
// 35_Singleton
//
// Created by jiangwei on 14-10-13.
// Copyright (c) 2014年 jiangwei. All rights reserved.
// #import "AdressBook.h" static AdressBook *instance = nil;//不能让外部访问,同时放在静态块中的 @implementation AdressBook + (AdressBook *)shareInstance{
if(instance == nil){
instance = [[AdressBook alloc] init];
}
return instance;
} //限制方法,类只能初始化一次
//alloc的时候调用
+ (id) allocWithZone:(struct _NSZone *)zone{
if(instance == nil){
instance = [super allocWithZone:zone];
}
return instance;
} //拷贝方法
- (id)copyWithZone:(NSZone *)zone{
return instance;
} //需要重写release方法,不能让其引用+1
- (id)retain{
return self;
} //需要重写release方法,不能让其引用-1
- (oneway void)release{
//do Nothing...
} - (id)autorelease{
return self;
} @end

我们定义了一个static类型的对象

static AdressBook *instance = nil;//不能让外部访问,同时放在静态块中的

提供一个获取单实例的类方法

+ (AdressBook *)shareInstance{
if(instance == nil){
instance = [[AdressBook alloc] init];
}
return instance;
}

重写allocWithZone方法,让初始化只做一次

//限制方法,类只能初始化一次
//alloc的时候调用
+ (id) allocWithZone:(struct _NSZone *)zone{
if(instance == nil){
instance = [super allocWithZone:zone];
}
return instance;
}

还有其他方法也是需要重写的

//拷贝方法
- (id)copyWithZone:(NSZone *)zone{
return instance;
} //需要重写release方法,不能让其引用+1
- (id)retain{
return self;
} //需要重写release方法,不能让其引用-1
- (oneway void)release{
//do Nothing...
} - (id)autorelease{
return self;
}

拷贝方法只能返回当前的单实例

retain和release方法不能进行引用的+1和-1操作

测试代码

main.m

//
// main.m
// 35_Singleton
//
// Created by jiangwei on 14-10-13.
// Copyright (c) 2014年 jiangwei. All rights reserved.
// #import <Foundation/Foundation.h> #import "AdressBook.h" //单利模式
int main(int argc, const char * argv[]) {
@autoreleasepool { AdressBook *book1 = [AdressBook shareInstance];
AdressBook *book2 = [AdressBook shareInstance]; NSLog(@"%@",book1);
NSLog(@"%@",book2); }
return 0;
}

两个指针指向的是同一个对象

总结

这一篇文章主要介绍了OC中的单例模式,同时我们OC学习篇的系列章程也就结束了,当然这些并不代表OC中所有的内容,还有很多其他内容,我们只有后面慢慢的去使用他才会越来越了解。

OC学习篇之---单例模式的更多相关文章

  1. OC学习篇之---总结和学习目录

    今天终于把OC的基础知识学习完了,但是这些知识只是最基础的,还有很多高级知识,这个可能需要后面慢慢的去学习才能体会到.下面就是这次学习OC的目录教程,如果大家发现有什么不正确的地方,请指正,小弟是新生 ...

  2. (转载)OC学习篇之---概述

    前言 终于开启了OC的学习篇了,之前由于工作上的事,学习就一直搁浅了,不过最近由于各种原因,感觉必须要开启iOS的开发旅程了,不然就老了.因为之前一直是做Android的,所以学习iOS来就没那么费劲 ...

  3. (转载)OC学习篇之---类的三大特性:封装,继承,多态

    之前的一片文章介绍了OC中类的初始化方法和点语法的使用,今天来继续学习OC中的类的三大特性,我们在学习Java的时候都知道,类有三大特性:继承,封装,多态,这个也是介绍类的时候,必须提到的话题,那么今 ...

  4. (转载)OC学习篇之---第一个程序HelloWorld

    之前的一片文章简单的介绍了OC的相关概述,从这篇开始我们就开始学习OC的相关知识了,在学习之前,个人感觉需要了解的其他的两门语言:一个是C/C++,一个是面向对象的语言(当然C++就是面向对象,不过这 ...

  5. OC学习篇之---文件的操作

    今天我们来介绍OC中文件操作,在之前的文章中,已经接触到了文件的创建了,但是那不是很具体和详细,这篇文章我们就来仔细看一下OC中是如何操作文件的: 第一.首先来看一下本身NSString类给我们提供了 ...

  6. OC学习篇之---第一个程序HelloWorld

    从这篇开始我们就开始学习OC的相关知识了,在学习之前,个人感觉需要了解的其他的两门语言:一个是C/C++,一个是面向对象的语言(当然C++就是面向对象,不过这里最好还是Java).在干活之前,得先找到 ...

  7. OC学习篇之---类的三大特性(封装,继承,多态)

    之前的一片文章介绍了OC中类的初始化方法和点语法的使用:http://blog.csdn.net/jiangwei0910410003/article/details/41683873,今天来继续学习 ...

  8. (转载)OC学习篇之---归档和解挡

    前几篇文章说到了OC中的Foundation框架,今天我们来看一下OC中的一个重要知识点:归档 OC中的归档就是将对象写入到一个文件中,Java中的ObjectInputStream和ObjectOu ...

  9. (转载)OC学习篇之---Foundation框架中的其他类(NSNumber,NSDate,NSExcetion)

    前一篇说到了Foundation框架中的NSDirctionary类,这一一篇来看一下Foundation的其他常用的类:NSNumber,NSDate,NSException. 注:其实按照Java ...

随机推荐

  1. Java Web学习总结(10)学习总结-EL表达式

    一,EL 表达式概述(EL主要从域中取数据) EL(Express Lanuage)表达式可以嵌入在jsp页面内部,减少jsp脚本的编写,EL出现的目的是要替代jsp页面中脚本的编写. 二,EL从域中 ...

  2. spring-boot整合Dubbo分布式架构案例

    1.运行环境 开发工具:intellij idea JDK版本:1.8 项目管理工具:Maven 3.2.5 2.项目文件目录 3.Maven Plugin管理 总项目 pom.xml配置代码: &l ...

  3. Sql server 2008 的完成备份和差异备份还原

    当数据库数据量不大的情况下用 Sqlserver 的完全备份就完全可以了 步骤为: 1.在需要还原的数据库上右键选择如图 2.在“常规”选项中点击“源设备”选取磁盘上备份好的.bak文件后,勾上“还原 ...

  4. CMMI模型

    CMMI的成熟度级别 初始级(过程不可预测,管理和控制差,是反应式的)管理级(过程处于项目级,经常是反应式的)定义级(过程已经提升到组织级(OSSP))定量管理级(对过程进行度量,并进行统计控制)优化 ...

  5. RabbitMQ的简单应用【转】

    虽然后台使用了读写分离技术,能够在一定程度上抗击高并发,但是如果并发量特别巨大时,主数据库不能同时处理高并发的请求,这时数据库容易宕机. 问题: 现在的问题是如何既能保证数据库正常运行,又能实现用户数 ...

  6. (66) c# async await

    1.使用 async await 2.返回值 static void Main(string[] args) { Program p = new Program(); Console.WriteLin ...

  7. 17. Jmeter-取样器一

    jmeter-sampler介绍与使用 HTTP请求 Test Action Debug Sampler AJP/1.3 Sampler Access Log Sampler BeanShell Sa ...

  8. 启动线程,start和run的区别

    每个线程都有要执行的任务.线程的任务处理逻辑可以在Tread类的run实例方法中直接实现或通过该方法进行调用,因此 run()相当于线程的任务处理逻辑的入口方法,它由Java虚拟机在运行相应线程时直接 ...

  9. Series序列

    import pandas as pd '''Series序列:1.序列 的声明,指定index列标签2.查看列索引(index)和元素 (values)3.选择内部元素4.为元素赋值5.用Numpy ...

  10. 什么是中间件?中间件和java应用关系是什么

    中间件,比如websphere 是一种独立的系统软件,你的java应用要通过它来管理,比如数据库连接,消息通信等,中间件位于操作系统之上.简单滴说,你不可能直接把你的java应用部署在操作系统上,得由 ...