[oc学习日记]单例模式

首先来了解一下单例模式的概念

单例模式就是保证系统中只存在一个对象(只有一个地址)的模式

下面我们就由一个学生类举例说明

因为要保证系统只有一个对象就要重写对象的创建方法,对象的拷贝方法

1 #import <Foundation/Foundation.h>
2 //因为要重写拷贝方法,所以要遵循拷贝协议
3 @interface Student : NSObject<NSCopying,NSMutableCopying>
4 +(id)create;//声明创建对象的方法
5 @end

接下来我们再来看这些方法的实现过程

注意事项:

1.一定要先创建一个静态全局的对象(确保只有一个地址的保障)

2.重写alloc和new的创建方法时,使用类名创建会出错,所以要用super

3.为防止多线程操作冲突,要用@synchronized进行避免

 1 #import "Student.h"
 2 //首先要创建一个静态全局的对象
 3 static Student *stu = nil;
 4 @implementation Student
 5 +(id)create//实现创建对象的方法
 6 {
 7     @synchronized (self)//防止多线程操作冲突
 8     {
 9         if (stu == nil) {
10             stu = [[Student alloc]init];//如果对象为空的话,就创建新对象,否则返回,保证只有一个对象
11         }
12         return stu;
13     }
14 }
15 //重写alloc和new的创建对象方法
16 +(instancetype)allocWithZone:(struct _NSZone *)zone
17 {
18     @synchronized (self)
19     {
20         if (stu == nil) {
21             stu = [[super allocWithZone:zone]init];//如果对象为空的话,就创建新对象,否则返回,保证只有一个对象
22         }
23         return stu;
24     }
25 }
26 //重写浅拷贝方法
27 -(id)copyWithZone:(NSZone *)zone
28 {
29     return stu;
30 }
31 //重写深拷贝方法
32 -(id)mutableCopyWithZone:(NSZone *)zone
33 {
34     return stu;
35 }
36 @end

主函数的实现

我们虽然在主函数中定义了很多student的方法,但是所有对象的空间只有一个

 1 #import <Foundation/Foundation.h>
 2 #import "Student.h"
 3 int main(int argc, const char * argv[]) {
 4     @autoreleasepool {
 5         Student *stu = [[Student alloc]init];
 6         Student *stu1 = [[Student alloc]init];
 7         Student *stu2 = [Student new];
 8         Student *stu3 = [stu copy];
 9         Student *stu4 = [stu mutableCopy];
10         NSLog(@"\n%@\n%@\n%@\n%@\n%@",stu,stu1,stu2,stu3,stu4);
11     }
12     return 0;
13 }

主函数的运行效果

2015-06-05 09:17:48.274 day26_01[643:12774]
<Student: 0x100304460>
<Student: 0x100304460>
<Student: 0x100304460>
<Student: 0x100304460>
<Student: 0x100304460>
时间: 2024-11-05 13:34:24

[oc学习日记]单例模式的相关文章

黑马程序员-OC学习日记-对象与方法、对象与函数

------- ios培训. android培训.java培训.期待与您交流! ---------- 一.NSString类简介 1.NSString是OC中用来表示字符串的一个类 2.NSString类创建 (1)通过字面量方式创建 NSString * str = @"要努力学习!"; (2)通过对象方法创建 NSString * str1 = [NSString alloc]; str1 = [str1 initWithUTF8String:"今天雾霾好大!"

黑马程序员-OC学习日记-继承、多态

------- ios培训. android培训.java培训.期待与您交流! ---------- 一.两个关键字self和super 1.局部变量与成员变量 (1)在方法内部可以定义与成员变量同名的局部变量. 在局部变量作用域内,会覆盖成员变量 (2)如果在方法内部定义了与成员变量同名的局部变量. 通过self访问成员变量,以区别局部变量 (3)全局变量是整个文件共享的,如果在一个方法中修改全局变量,在其他方法中使用这个全局变量都会修改 (4)就近原则: 查找顺序:局部变量  ->  成员变

[oc学习日记]字典

1 //字典的创建 2 NSDictionary *d1 = [NSDictionary dictionary]; 3 //将创建的字典的内容设置为制定的文件的内容 4 NSString *path = @"";//文件路径 5 NSDictionary *d2 = [NSDictionary dictionaryWithContentsOfFile:path]; 6 //创建具有一个键值的字典 7 NSDictionary *d3 = [NSDictionary dictionary

[oc学习日记]kvc,kvo和通知

KVC键值对编码 kvc键值对编码就是在对象没有声明属性(毕竟能用点方法没几个人会再去用kvc),成员变量没有公有化,并且没有写描述方法时使用的一种给成员变量或者属性赋值的一种方式. 例如: //我们创建了一个学生类,并将其实例化 Student *stu = [[Student alloc]init]; //给学生队形的name成员变量使用kvc赋值 [stu setValue:@"ss" forKey:@"name"]; //取出使用键值对进行赋值了的name成

[oc学习日记]代理模式

何为代理模式,代理模式也成委托模式 代理模式顾名思义,就是一个人让另一个个人帮助他做某事 我们下面就用一个代购的故事为大家讲解代理模式 1.首先我们要创建一个协议,该协议具有具体功能(代购的功能) 1 #import <Foundation/Foundation.h> 2 //声明协议 3 @protocol delegate <NSObject> 4 //协议中代购的方法 5 -(void)buy; 6 @end 2.谁可以实现这个功能,就让这个类去遵循这个协议(在这个例子中,代

学习日记之单例模式和Effective C++

单例模式(Singleton):保证一个类仅有一个实例,并提供一个访问它的全局访问点. (1),通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象.一个最好的办法就是,让类自身负责保存它的唯一实例.这个类可以保证没有其他实例被创建,并且它可以提供一个访问该实例的方法. (2),lock 是确保当一个线程位于代码的临界区时,另一个线程不进入临界区.如果其他线程试图进入锁定的代码,则它将一直等待,知道该对象被释放. (3),双重锁定解决效率问题. (4),C#与公共语言运行库

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

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

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

在之前的一片文章中介绍了对象的拷贝相关知识,今天我们来看一下OC中的单例模式,单例模式在设计模式中用的可能是最多的一种了,而且也是最简单的一种 实现单例模式有三个条件 1.类的构造方法是私有的 2.类提供一个类方法用于产生对象 3.类中有一个私有的自己对象 针对于这三个条件,OC中都是可以做到的 1.类的构造方法是私有的 我们只需要重写allocWithZone方法,让初始化操作只执行一次 2.类提供一个类方法产生对象 这个可以直接定义一个类方法 3.类中有一个私有的自己对象 我们可以在.m文件

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

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