(转载)OC学习篇之---单例模式

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

实现单例模式有三个条件

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

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

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

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

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

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

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

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

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

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

下面来看代码:

AdressBook.h

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

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

AdressBook.m

 1 //
 2 //  AdressBook.m
 3 //  35_Singleton
 4 //
 5 //  Created by jiangwei on 14-10-13.
 6 //  Copyright (c) 2014年 jiangwei. All rights reserved.
 7 //
 8
 9 #import "AdressBook.h"
10
11 static AdressBook *instance = nil;//不能让外部访问,同时放在静态块中的
12
13 @implementation AdressBook
14
15 + (AdressBook *)shareInstance{
16     if(instance == nil){
17         instance = [[AdressBook alloc] init];
18     }
19     return instance;
20 }
21
22 //限制方法,类只能初始化一次
23 //alloc的时候调用
24 + (id) allocWithZone:(struct _NSZone *)zone{
25     if(instance == nil){
26         instance = [super allocWithZone:zone];
27     }
28     return instance;
29 }
30
31 //拷贝方法
32 - (id)copyWithZone:(NSZone *)zone{
33     return instance;
34 }
35
36 //需要重写release方法,不能让其引用+1
37 - (id)retain{
38     return self;
39 }
40
41 //需要重写release方法,不能让其引用-1
42 - (oneway void)release{
43     //do Nothing...
44 }
45
46 - (id)autorelease{
47     return self;
48 }
49
50 @end 

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

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

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

1 + (AdressBook *)shareInstance{
2     if(instance == nil){
3         instance = [[AdressBook alloc] init];
4     }
5     return instance;
6 }  

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

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

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

 1 //拷贝方法
 2 - (id)copyWithZone:(NSZone *)zone{
 3     return instance;
 4 }
 5
 6 //需要重写release方法,不能让其引用+1
 7 - (id)retain{
 8     return self;
 9 }
10
11 //需要重写release方法,不能让其引用-1
12 - (oneway void)release{
13     //do Nothing...
14 }
15
16 - (id)autorelease{
17     return self;
18 }  

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

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

测试代码

main.m

 1 //
 2 //  main.m
 3 //  35_Singleton
 4 //
 5 //  Created by jiangwei on 14-10-13.
 6 //  Copyright (c) 2014年 jiangwei. All rights reserved.
 7 //
 8
 9 #import <Foundation/Foundation.h>
10
11 #import "AdressBook.h"
12
13 //单利模式
14 int main(int argc, const charchar * argv[]) {
15     @autoreleasepool {
16
17         AdressBook *book1 = [AdressBook shareInstance];
18         AdressBook *book2 = [AdressBook shareInstance];
19
20         NSLog(@"%@",book1);
21         NSLog(@"%@",book2);
22
23     }
24     return 0;
25 }

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

总结

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

时间: 2024-10-24 10:51:48

(转载)OC学习篇之---单例模式的相关文章

OC学习篇之---单例模式

在之前的一片文章中介绍了对象的拷贝相关知识:http://blog.csdn.net/jiangwei0910410003/article/details/41926531,今天我们来看一下OC中的单例模式,单例模式在设计模式中用的可能是最多的一种了,而且也是最简单的一种 实现单例模式有三个条件 1.类的构造方法是私有的 2.类提供一个类方法用于产生对象 3.类中有一个私有的自己对象 针对于这三个条件,OC中都是可以做到的 1.类的构造方法是私有的 我们只需要重写allocWithZone方法,

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

今天终于把OC的基础知识学习完了,但是这些知识只是最基础的,还有很多高级知识,这个可能需要后面慢慢的去学习才能体会到.下面就是这次学习OC的目录教程,如果大家发现有什么不正确的地方,请指正,小弟是新生,多请OC老鸟来喷~~ 1.OC学习篇之---概述 2.OC学习篇之---第一个程序HelloWorld 3.OC学习篇之---类的定义 4.OC学习篇之---类的初始化方法和点语法的使用 5.OC学习篇之---类的三大特性(封装,继承,多态) 6.OC学习篇之[email protected]关键

(转载)OC学习篇之[email&#160;protected]关键字的作用以及#include和#import的区别

前一篇文章说到了OC中类的三大特性,今天我们来看一下在学习OC的过程中遇到的一些问题,该如何去解决,首先来看一下我们之前遗留的一个问题: 一.#import和#include的区别 当我们在代码中使用两次#include的时候会报错:因为#include相当于拷贝头文件中的声明内容,所以会报重复定义的错误 但是使用两次#import的话,不会报错,所以他可以解决重复导入的问题,他会做一次判断,如果已经导入一次就不导入了 二.关键字@class的作用 在来看一下OC中的关键字@class的作用,在

OC学习篇之[email&#160;protected]关键字的作用以及#include和#import的区别

前一篇文章说到了OC中类的三大特性:http://blog.csdn.net/jiangwei0910410003/article/details/41707161今天我们来看一下在学习OC的过程中遇到的一些问题,该如何去解决,首先来看一下我们之前遗留的一个问题: 一.#import和#include的区别 当我们在代码中使用两次#include的时候会报错:因为#include相当于拷贝头文件中的声明内容,所以会报重复定义的错误 但是使用两次#import的话,不会报错,所以他可以解决重复导入

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

前言 终于开启了OC的学习篇了,之前由于工作上的事,学习就一直搁浅了,不过最近由于各种原因,感觉必须要开启iOS的开发旅程了,不然就老了.因为之前一直是做Android的,所以学习iOS来就没那么费劲了,当然我们知道,Android是Java语言支撑的,iOS是OC支撑的,关于OC的学习,会和Java相对比这来,这样效率也会高点,同时在大学里学了C/C++所以,学习OC就没什么难度了,就是一套新的api. 概述 目前来说,Objective-C(简称OC)是iOS开发的核心语言,在开发过程中也会

OC学习篇之---概述

前言 终于开启了OC的学习篇了,之前由于工作上的事,学习就一直搁浅了,不过最近由于各种原因,感觉必须要开启iOS的开发旅程了,不然就老了.因为之前一直是做Android的,所以学习iOS来就没那么费劲了,当然我们知道,Android是Java语言支撑的,iOS是OC支撑的,关于OC的学习,会和Java相对比这来,这样效率也会高点,同时在大学里学了C/C++所以,学习OC就没什么难度了,就是一套新的api. 概述 目前来说,Objective-C(简称OC)是iOS开发的核心语言,在开发过程中也会

(转载)OC学习篇之---文件的操作

前一篇文章中我们讲到了OC中的归档和解档操作,今天我们来介绍OC中文件操作,在之前的文章中,已经接触到了文件的创建了,但是那不是很具体和详细,这篇文章我们就来仔细看一下OC中是如何操作文件的: 第一.首先来看一下本身NSString类给我们提供了哪些可以操作文件路径名的方法 1 // 2 // main.m 3 // 37_FilePathHandle 4 // 5 // Created by jiangwei on 14-10-13. 6 // Copyright (c) 2014年 jian

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

之前的一片文章介绍了OC中类的初始化方法和点语法的使用,今天来继续学习OC中的类的三大特性,我们在学习Java的时候都知道,类有三大特性:继承,封装,多态,这个也是介绍类的时候,必须提到的话题,那么今天就来看一下OC中类的三大特性: 一.封装 学习过Java中类的同学可能都知道了,封装就是对类中的一些字段,方法进行保护,不被外界所访问到,有一种权限的控制功能,Java中有四种访问权限修饰符:public,default,protected,private,访问权限一次递减的,这样我们在定义类的时

(转载)OC学习篇之---代理模式

在前一篇文章我们介绍了OC中的协议的概念,这篇文章我们就来介绍一下OC中的代理模式,关于代理模式,如果还有同学不太清楚的话,就自己去补充知识了,这里就不做介绍了,这里只介绍OC中是如何实现代理模式的. 这里举一个简单的例子: 小孩类,护士类,保姆类,其中小孩类有两个方法:wash和play 这里代理对象就是:护士类.保姆类,小孩类是被代理对象. 看一下代码: 首先看一下小孩类: Children.h 1 // 2 // Children.h 3 // 12_DesignStyle 4 // 5