单例 singleton

一、单例模式

特点:单例模式的类必须保证始终只有一个实例存在。

场景:在整个应用程序中,共享一份资源(这份资源只需要创建初始化1次),应该让这个类创建出来的对象永远只有一个。

二、单例类的构建

1:为你的单例类声明一个静态的实例,并且初始化它的值为nil。

2:在获取实例的方法中,只有在静态实例为nil的时候,产生一个你的类的实例,这个实例通常被称为共享的实例。

3:重写allocWithZone 方法,用于确定:不能够使用其他的方法来创建我们不得实例,限制用户只能通过获取实例的方法得到这个类的实例。所以,我们在allocWithZone方法中直接返回共享的类实例。

4:实现基本的协议方法 copyWithZone、release、retain、retainCount 和 autorelease,用于保证单例具有一个正确的状态。(MRC下)非arc

5:在init方法中初始化一些东西

三、多线程下的单例

使用@sychronized(){}指令

四、栗子

#import <Foundation/Foundation.h>

//图片管理类
//单例类

@interface ZYImageManager : NSObject

+ (ZYImageManager *)shareImageManager;

- (void)test;

@end

#import "ZYImageManager.h"

/*
 1、声明静态实例 并初始化值为nil
 2、声明静态方法 方法中判断如果实例为nil就创建
 3、重写allocWithZone方法 杜绝创建新的实例
 4、重写copyWithZone方法 防止对象copy
 5、重写引用计数相关东西 推荐
 6、init方法 初始化一些东西
 7、因为创建本类实例时 使用了alloc alloc会调用allocWithZone 然而allocWithZone又被本类重写了 所以应改为[super allocWithZone:NULL]
 8、处理多线程下的线程同步
 */

//栈、堆、全局变量区(静态区)、方法区、常量区
static ZYImageManager *singletonInstance = nil;
static int count = 10;  // count 的作用是证明这个类只创建了一次

@implementation ZYImageManager

+ (ZYImageManager *)shareImageManager
{
    //@synchronized(self) 管理线程:Objective-C在应用程序中支持多任务。这意味着可能有两个线程同时试图修改同一个对象。有一个办法可以解决这个情况。为了防止多个线程同时执行同一个代码块,OC提供了@synchronized()指令。
    //使用@synchronized()指令可以锁住在线程中执行的某一个代码块。使用代码块的其他线程,将被阻塞,这也就意味着,他们将在@synchronized()代码块的最后一条语句执行结束后才能继续执行。一般在公用变量的时候使用,如单例模式或者操作类的static变量中使用。
    @synchronized(self)
    {
        if (singletonInstance == nil) {
           //调用父类方法开辟空间 参数无用
            singletonInstance = [[super allocWithZone:NULL] init]; //在NSObject 这个类的官方文档里面,allocWithZone方法介绍说,该方法的参数是被忽略的,正确的做法是传nil或者NULL参数给它。而这个方法之所以存在,是历史遗留原因。就是你不用传参就会给你开辟空间
           //而为什么不用[[ super alloc] init]那 因为这样他还会调用子类的allocwithzoon
            count++;
        }
    }
    return singletonInstance;
}

//重写初始化方法 初始化一些需要初始化的东西
- (id)init
{
    self = [super init];
    if (self)
    {

    }
    return self;
}

//分配内存
//因为alloc会调用此方法 所以应重写防止其再创建对象
+ (id)allocWithZone:(struct _NSZone *)zone
{
    return singletonInstance;
}

//copy时会调用此方法
+ (id)copyWithZone:(struct _NSZone *)zone
{
    return singletonInstance;
}

//重写一下跟引用计数有关的东西 推荐
- (id)retain
{
    return self;
}

//重写release以及autorelease
- (oneway void)release
{

}

- (id)autorelease
{
    return self;
}

//返回1可以 如下亦可
- (NSUInteger)retainCount
{
    return NSUIntegerMax;
}

- (void)test
{
    NSLog(@"%d", count);
}
@end

#import "ZYAppDelegate.h"
#import "ZYImageManager.h"

@implementation ZYAppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    //测试单例
    [[ZYImageManager shareImageManager] test];

    ZYImageManager *imageManager = [ZYImageManager shareImageManager];
    [imageManager test];

    ZYImageManager *imageManager2 = [[ZYImageManager alloc] init];

    //查看单例内存地址  内存地址一样  没什么好说的
    NSLog(@"%@__%@", imageManager2, imageManager);
    [imageManager2 test];

    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    return YES;
}

@end
时间: 2024-12-28 08:24:22

单例 singleton的相关文章

Android与设计模式——单例(Singleton)模式

概念: java中单例模式是一种常见的设计模式.单例模式分三种:懒汉式单例.饿汉式单例.登记式单例三种. 单例模式有一下特点: 1.单例类仅仅能有一个实例. 2.单例类必须自己自己创建自己的唯一实例. 3.单例类必须给全部其它对象提供这一实例. 单例模式确保某个类仅仅有一个实例.并且自行实例化并向整个系统提供这个实例.在计算机系统中,线程池.缓存.日志对象.对话框.打印机.显卡的驱动程序对象常被设计成单例.这些应用都或多或少具有资源管理器的功能.每台计算机能够有若干个打印机,但仅仅能有一个Pri

Objective-C设计模式——单例Singleton(对象创建)

单例 和其它语言的单例产不多,可以说是最简单的一种设计模式了.但是有几个点需要注意下,单例就是一个类只有一个实例. 所以我们要想办法阻止该类产生别的实例,一般语言中都会将构造函数写为private.但是OC中的函数并没有限定符,所以我们需要用一些小技巧来屏蔽这一点. 应用场景 类只能有一个实例,而且必须从一个为人熟知的访问点对其进行访问,比如工厂方法. 这个唯一的实例只能通过类的子类化进行扩展,而且扩展的对象不会破坏客户端代码. 注意 1.OC中单例的实例变量要定义在.m文件 2.OC中单例需要

设计一个线程安全的单例(Singleton)模式

在设计单例模式的时候,虽然很容易设计出符合单例模式原则的类类型,但是考虑到垃圾回收机制以及线程安全性,需要我们思考的更多.有些设计虽然可以勉强满足项目要求,但是在进行多线程设计的时候.不考虑线程安全性,必然会给我们的程序设计带来隐患.此处,我们不介绍什么是单例模式,也不介绍如何设计简单的设计模式,因为你完全可以在书上或者在博客中找到.此处我们的目的就是设计一个使用的单例模式类.单例模式需要注意与思考的问题: (1)如何仅能实例化一个对象? (2)怎么样设计垃圾回收机制? (3)如何确保线程安全性

手写单例singleton

1 // 2 // ViewController.m 3 // singleton 4 // 5 // Created by ys on 15/11/23. 6 // Copyright (c) 2015年 ys. All rights reserved. 7 // 8 9 10 #import "ViewController.h" 11 #import "singletonClass.h" 12 13 @interface ViewController () 14

单例singleton

public class Test    {        #region 单例        ///<summary>        ///单例对象        ///</summary>        private static Singleton<Test> Singleton;        ///<summary>        ///实例        ///</summary>        public static Test

写一个单例(Singleton),并说明单例的目的和好处

单例的目的:保证一个类只有单一的实例,也就是说你无法通过new来创建这个类的一个新实例. 单例的好处:当一个对象在程序内部只能有一个实例的时候,它可以保证我们不会重复创建,而是始终指向同一个对象. Singleton通过将构造方法限定为private避免了类在外部被实例化,在同一个虚拟机范围内,Singleton的唯一实例只能通过getInstance()方法访问. 第一种:在声明变量时实例化(也叫饿汉式单例模式),代码如下: public class Singleton { private s

如何写一个比较严谨的单例Singleton模式

iOS真正意义上的单例模式: 我们在程序中很多时候要保证一个类只有一个唯一的实例,一般情况下初始化对象是通过[[Class alloc]init]来完成的,alloc是分配内存空间,init是对象的初始化,分配对象内存空间的另一个方法是allocWithZone方法,实际操作中当调用alloc方法来给对象分配空间时,默认也调用了allocWithZone方法.如果我们在初始化对象的时候没有使用alloc方法,而是直接使用allocWithZone方法的话,就没法保证这个单例是真正意义上的单例了,

Effective java 第2版 - 笔记(01) 单例(Singleton)的枚举(enum)实现

直接上代码: 1 public enum Boss { 2 3 INSTANCE; 4 5 private String name; 6 7 public void doSomeThing() { 8 System.out.println(name + " is doing something now..."); 9 } 10 11 public String getName() { 12 return name; 13 } 14 15 public void setName(Stri

Swift设计模式之单例(SINGLETON)

一.意图保证一个类公有一个实例,并提供一个访问它的全局访问点. 二.使用场景1.使用场景当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时. 2.实现的重要三个步骤私有化构造方法(Swift不支持)使用一个静态变量保存实例的引用 提供一个全局的访问方法三. Swift语言下的实现Swift语言不支持变量及方法的权限,没有办法隐藏变量及方法,可以随意直接创建一个实例.单例的创建有很多写法,Swift支