- 单例模式,就是一个类始终只有一个实例,不管如果copy还是retain还是alloc等等,都只有一个实例。为什么?有什么好处?
简单来说:
a:有的东西只能有一个,那就必须用单例;
b:单例的好处就是不会有多余的实例,所以节约内存;
c:因为只有一个单例,所以易于管理多线程对它的访问。
d:其他的原因……省略
我们创建一个单例的User类,然后生成一个user1对象,再把这个对象进行copy、retain这些,再看看它们是否是同一个实例,还是被创建出多个实例?
(1)User.h
1.
#
import
<Foundation/Foundation.h>
2.
3.
@interface
User : NSObject<NSCopying>
//拷贝协议表明该对象可被拷贝,尽管都是同一个(因为是单例)
4.
@property
(nonatomic,copy) NSString *name;
5.
@property
(nonatomic,copy) NSString *email;
6.
//一般用share或者default做前缀,易于阅读标记为单例共享方法
7.
+(id)shareUser;
8.
@end
(2)User.m
01.
#
import
"User.h"
02.
static
User *user1=nil;
//先定义一个空得静态实例
03.
@implementation
User
04.
+(id)shareUser{
05.
@synchronized
(self){
//线程锁,防止多线程访问冲突
06.
if
(user1==nil) {
//判断这个实例是否为空,即是否已被创建
07.
user1=[[[self
class
]alloc]init];
//如果没被创建,就初始化一个
08.
}
09.
}
10.
return
user1;
//如果已存在,则不创建,直接返回即可
11.
}
12.
13.
//以下都是防止实例不是唯一的一些方法,是通用格式,不必死记硬背,可以直接拷贝到任何单例模式中
14.
//这是在调用alloc时可防止重复创建实例
15.
+(id)allocWithZone:(NSZone *)zone{
16.
if
(user1==nil) {
17.
user1=[
super
allocWithZone:zone];
18.
}
19.
return
user1;
20.
}
21.
//这是在拷贝对象时防止重复创建
22.
-(id)copyWithZone:(NSZone *)zone{
23.
return
user1;
24.
}
25.
//这是在retain对象时防止重复创建,当然在ARC开启时可省略这个
26.
-(id)retain{
27.
return
user1;
28.
}
29.
//在release时什么都不做,因为一共就一个实例,不重复引用,所以不能release
30.
-(oneway
void
)release{
31.
32.
}
33.
//在autorelease时,返回实例,在ARC下客省略
34.
-(
void
)autorelease{
35.
return
user1;
36.
}
37.
//返回的时无符号整型,即大于0的数字,在ARC下可省略
38.
-(NSUInteger)retainCount{
39.
return
UINT_MAX;
40.
}
41.
@end
(3)main.m
01.
#
import
<Foundation/Foundation.h>
02.
#
import
"User.h"
03.
04.
int
main(
int
argc,
const
char
* argv[])
05.
{
06.
@autoreleasepool
{
07.
User *user1=[User shareUser];
08.
User *user2=[User shareUser];
09.
User *user3=[[User alloc]init];
10.
User *user4=[user1 copy];
11.
NSLog(@
"%@,%@,%@,%@"
,user1,user2,user3,user4);
12.
}
13.
return
0
;
14.
}
(4)上面四个对象是否是同一个,看地址可知,是同一个,即事单例
<User: 0x100106e70>,<User: 0x100106e70>,<User: 0x100106e70>,<User: 0x100106e70>
总结:
a:单例设计模式用得比较多
b:不仅在OC中又,JAVA等其他语言中也有,单例设计模式其实是一种编程思想,而不仅仅是某种语言特有的
OC学习-单例设计模式的理解、案例和简单总结
时间: 2024-10-05 04:40:46
OC学习-单例设计模式的理解、案例和简单总结的相关文章
【OC学习-29】单例设计模式的理解、案例和简单总结
单例模式,就是一个类始终只有一个实例,不管如果copy还是retain还是alloc等等,都只有一个实例.为什么?有什么好处? 简单来说: a:有的东西只能有一个,那就必须用单例: b:单例的好处就是不会有多余的实例,所以节约内存: c:因为只有一个单例,所以易于管理多线程对它的访问. d:其他的原因--省略 我们创建一个单例的User类,然后生成一个user1对象,再把这个对象进行copy.retain这些,再看看它们是否是同一个实例,还是被创建出多个实例? (1)User.h #import
黑马程序员--Java基础学习笔记【单例设计模式、网络编程、反射】
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 设计模式分类: 创建模式:是对类的实例化过程的抽象化,又分为类创建模式和对象创建模式 类创建模式:工厂方法模式 对象-:简单工厂(静态工厂方法)模式.抽象工厂模式.单例模式.建造模式- 结构模式:描述如何将类或者对象结合在一起形成更大的结构 适配器模式.缺省模式.合成模式.装饰模式(包装模式).门面模式- 行为模式:对不同的对象之间划分责任和算法的抽象化 不变模式.策略模式.迭代子模式.命令模
JAVA学习第二十五课(多线程(四))- 单例设计模式涉及的多线程问题
一.多线程下的单例设计模式 利用双重判断的形式解决懒汉式的安全问题和效率问题 //饿汉式 /*class Single { private static final Single t = new Single(); private Single(){} public static Single getInstance() { return t; } } */ //懒汉式 class Single { private static Single t = null; private Single()
【学习笔记】单例设计模式笔记
单例设计模式是常见的设计模式之一.通过单例实现所需求类在系统中只存在唯一一个实例. 单例设计模式分两种:懒汉单例设计模式和饿汉单例设计模式,两者设计思路一致,实现有微小不同. 实现代码: 1 public class HungryMan { 2 3 private HungryMan(){};//私有的构造方法保证HungryMan类无法在外部使用构造方法实例化 4 private static final HungryMan hungryMan=new HungryMan();//在类内定义一
OC中的单例设计模式及单例的宏抽取
1 // 在一个对象需要重复使用,并且很频繁时,可以对对象使用单例设计模式 2 // 单例的设计其实就是多alloc内部的allocWithZone下手,重写该方法 3 4 #pragma Person.h文件 5 6 #import <Foundation/Foundation.h> 7 @interface Person : NSObject <NSCopying,NSMutableCopying> 8 + (instancetype)sharePerson; // 给类提供一
JAVA学习第十课(单例设计模式)
杂谈: 如果一个类里的方法都是静态的,那么就没有必要创建对象,为了不让其他程序创建对象,就可以把当前类的构造函数私有化. class MAN { private MAN() { } } 文档注释:命令:javadoc 只能解析/** 开始至 */结束的内容:/* */则不行 路径设置问题: 当要运行,两个以上路径中的class文件时,路径都要设置,命令:classpath=.;c:\myhelp或者:classpath=.;%myhelp% 清除路径: set classpath= 设计模式:对
Java学习之单例设计模式
单例设计模式:解决一个类在内存只存在一个对象. (1) 想要保证对象唯一. a)为了避免其他程序过多建立该类对象.先禁止其他程序建立该类对象 b)还为了让其他程序可以访问到该类对象,只好在本类中,自定义一个对象. c)为了方便其他程序对自定义对象的访问,可以对外提供一些访问方式. (2) 这三部怎么用代码体现呢? a)将构造函数私有化. b)在类中创建一个本类对象. c)提供一个方法可以获取到该对象. (3) 对于事物该怎么描述,还怎么描述. 当需要将该事物的对象保证在内存中唯一时,就将以上的三
黑马程序员-学习日记(单例设计模式的两种类型)
单例设计模式:解决一个类在内存中只有一个对象 多个程序使用统一配置信息对象时,需要保证该对对象的唯一性. 保证对象唯一性的实现步骤: 1.将构造函数私有化:为了避免其他程序过多建立该对象,禁止其他程序调用该对象. 2.在类中创建一个本类对象:为了让其他程序可以访问该类对象 3.提供一个方法可以获取到该对象的方法:方便其他程序访问自定义的本类对象.(类方法的访问方式只有两种,建立对象或定义为静态方法)
Java学习笔记(二十四):单例设计模式singleton
为什么要使用singleton设计模式? 假设设计了一个操作数组的工具类(Tools),里面有一个锤子的方法(Hammer),如果不使用singleton设计模式,每次想调用Hammer方法都需要new一个Tools类出来 1 class Tools{ 2 //锤子 3 public void Hammer(){ 4 System.out.println("使用锤子"); 5 } 6 } 7 8 public class ToolsDemo { 9 public static void