OC学习-单例设计模式的理解、案例和简单总结

    • 单例模式,就是一个类始终只有一个实例,不管如果copy还是retain还是alloc等等,都只有一个实例。为什么?有什么好处?

      简单来说:

      a:有的东西只能有一个,那就必须用单例;

      b:单例的好处就是不会有多余的实例,所以节约内存;

      c:因为只有一个单例,所以易于管理多线程对它的访问。

      d:其他的原因……省略

      我们创建一个单例的User类,然后生成一个user1对象,再把这个对象进行copy、retain这些,再看看它们是否是同一个实例,还是被创建出多个实例?

      (1)User.h

      view sourceprint?

      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

      view sourceprint?

      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

      view sourceprint?

      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等其他语言中也有,单例设计模式其实是一种编程思想,而不仅仅是某种语言特有的

时间: 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