OC学习篇之-----单例模式
来源:互联网 发布:python官网 中文版 编辑:程序博客网 时间:2024/05/24 05:30
单例模式:
/*
设计模式(用来解决编程某些特定问题) --单例模式
单例模式:
什么时候使用单例模式?
在一个工程中,一个类只需要一个实例变量,我们就可以讲这些类设计成单例模式
单例模式的作用:
当一个类A被设计成单例模式时,由类A构造出的实力对象对于其他类来讲为全局实例对象,即在每一个类中有A构造出的实例对象,都没相同的对象
单例模式的实现思路:一个类只能穿件一个实例和一个获得该实例的方法;
*/
其实单例模式就是实现一个类的对象只能在整个工程中存在一个,所以我们要做的就是,防止此类继续创建实例对象,或者 无论怎么创建都是同一个对象
首先要声明一个全局变量:确保全局就它一个实例对象
如下:1.
#import "Student.h"
//为单例模式声明一个静态实力对象,只会在第一次执行一次
static Student *st = nil;
@implementation Student
@end
2.在实现文件中声明一个方法,用来第一次创建实例对象,同时检测是否已经存在本实例对象,如下:
#import <Foundation/Foundation.h>
@interface Student : NSObject
//1.在要被设计成单例模式的类的.H文件中声明一个构造单利的方法
+(Student *)shareInatance;
@end
3,在。m文件里面实现构造单例的模式,如下:
+(Student *)shareInatance{
if (st == nil) {
st = [[Student alloc]init];
}
return st;
}
(如果单单由上面的方法创建出来的对象的话,都是同一对象,但是还可以通过alloc和new来创建新的实例对象的,所以我们还需要通过重写alloc和new创建实例的方法来确保实例对象的单一化)
//为了防止alloc或new创建新的实例变量,重写一下方法
+(instancetype)allocWithZone:(struct _NSZone *)zone{
@synchronized(self) //关于@synchronized(self):它的作用是创建一个互斥锁,保证此时没有其他线程对self对象进行修改,这个是OC中的一个锁令牌,防止self对象在同一时间内被其他线程访问,祈祷线程保护作用,一般在公用公用变量中使用,例如单例模式 或者 操作类的static变量中使用
{
if (st == nil)
{
st = [super allocWithZone:zone];
}
}
return st;
}
(上面已经解决了实现方法,alloc和new创建单一实例变量的单一性,但还有一个方法会产生实例对象,就是copy的实例化对象,所以,一样要从写,如下:)
//为了防止COPY产生新的对象,需要实现NSCopy协议
-(id)copyWithZone:(NSZone *)zone{
return self;
}
好了,单例模式就这么点东西,也可以说就是这么一个模板,只要把这个模板记着就以后都会用了,
总结:
1.创建一个全局变量
2.声明和实现一个创建单一变量的方法,把创建出来的单一对象给予全局变量
3.解决重复创建问题
3.1.重写alloc和new的allocWithZone方法;防止alloc或new新对象
3.2.重写copy的copyWithZone方法:防止copy新对象
- OC学习篇之---单例模式
- OC学习篇之-----单例模式
- OC学习笔记之单例模式
- 黑马程序员----OC学习之单例模式
- OC学习之单例
- [oc学习日记]单例模式
- OC 单例模式
- OC单例模式
- oc 单例模式
- OC-单例模式
- OC - 单例模式
- OC-单例模式
- oc单例模式
- oc单例模式
- OC单例模式
- OC-单例模式
- OC学习日记014-单例模式和委托模式
- 黑马程序员---OC学习笔记之简单的单例模式实现
- 单例模式
- Java系统架构设计
- Android样式开发之selector
- C++学习笔记-泛型算法
- Java笔记系列——java主类结构
- OC学习篇之-----单例模式
- 布局动画之LayoutTransition使用
- java web获取文件路径
- 闪客工具:微信本地调试工具
- Filter进行登录验证时循环重定向的解决方法(转)
- Java Socket
- Android开发笔记(二十三)文件对话框FileDialog
- android 一个应用两个入口一个应用两个快捷方式(不同图标显示)
- 这30类CSS选择器 你必须记在脑袋里!