在之前的一片文章中介绍了对象的拷贝相关知识: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. sql 用语句还原多数据文件的数据库

    /* 还原bak数据库文件*/ RESTORE DATABASE userdb_cs /*还原为userdb名的新数据库*/ FROM DISK = 'D:\工作资料\数据库文件\userdb.bak ...

  2. window安装consul

    安装consul 下载包: https://www.consul.io/ 解压 consul_1..2_windows_amd64.zip 复制 consul.exe 到 d:\soft\consul ...

  3. Gitblit用户没有push权限,但是已经在team里面配置了

    问题: 用户已经移动到team里面,team有对应repository的push权限. does not have push permissions for 解决方案: 发现这个用户以前单独配置了这个 ...

  4. linux下使用lftp的小结

    今天在解决一个远程服务器备份的问题时,用到了lftp的相关知识.整理如下: lftp的功能比较强大,相比原来用ftp,方便了很多. 1.登陆: lftp ftp://yourname@site pwd ...

  5. 斯坦福【概率与统计】课程笔记(四):EDA | 茎叶图

    茎叶图的只做方法如下: 将每个数字分成茎和叶 对所有茎排序,并纵向从小到大放置好 对相同茎下的叶归到一起并排序,垂直于茎的排列方向放置好 举个例子:我们有一份奥斯卡影后的年龄集合: 34 34 27 ...

  6. python 装饰器 第五步(2):带有返回值得装饰器

    #第五步:带有返回值的装饰器 把第四步复制过来 #用于扩展基本函数的函数 def kuozhan(func): #内部函数(扩展之后的eat函数) def neweat(): #以下三步就是扩展之后的 ...

  7. 隐藏父类方法的new和重写父类虚方法virtual的区别

    一.代码 public class Parent { public void Method_A() { Console.WriteLine("Parent Method_A"); ...

  8. Pycharm2019版官方版本激活码,无需破解

    AHD9079DKZ-eyJsaWNlbnNlSWQiOiJBSEQ5MDc5REtaIiwibGljZW5zZWVOYW1lIjoiSmV0IEdyb3VwcyIsImFzc2lnbmVlTmFtZ ...

  9. springCloud的使用09-----高可用的注册中心

    思路:创建多个注册中心,在他们的配置文件中配置相互之间的注册 1 在eureka-server项目的resources目录下创建两个配置文件application-peer1.yml和applicat ...

  10. Alpha版本——展示博客【第二组】

    成员简介 章豪 http://cnblogs.com/roar/ 角色: PM,后端 个人介绍: 努力学习开发的小菜鸡,管理小白,背锅组长 贡献: - 设计开发计划 - 跟踪项目进行 - 组织开组会 ...