IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 【iOS】—— 单例模式 -> 正文阅读

[移动开发]【iOS】—— 单例模式

一.单例模式的简单介绍:

单例模式是比较常见的一种设计模式,目的是保证一个类在运行期间有且只有一个实例,而且自行实例化并向整个系统提供这个实例,一直保存在内存中,到程序退出时由系统自动释放这部分内存。是避免频繁创造对象,节约内存的一种模式。

二.单例模式的优缺点:

单例模式的优点:

  • 单例可以保证系统中该类有且只有一个实例,所以很便于外界访问,对于项目中个别场景的传值,存储状态等更加方便。如果程序中出了问题,可以快速的定位问题所在。
  • 由于在整个程序中只存在一个对象,节省了系统内存资源,提高了程序的运行效率。

单例模式的缺点:

  • 单例不能被继承,不能有子类,因为它们共享一份资源,有子类单例模式就没有意义了。
  • 不易被重写或扩展(可以使用分类)。
  • 单例实例一旦创建,对象指针是保存在静态区的,那么在堆区分配空间只有在应用程序终止后才会被释放。单例对象只要程序在运行中就会一直占用系统内存,该对象在闲置时并不能销毁,在闲置时也消耗了系统内存资源。

三.单例模式的实现:

单例模式又可以分为两种模式:

  • 懒汉模式:第一次用到单例对象的时候再创建。
  • 饿汉模式:一进入程序就创建一个单例对象。(不常用)

懒汉模式:

#import <Foundation/Foundation.h>

@interface Singleton : NSObject<NSMutableCopying, NSCopying>

//获取单例
+ (instancetype)sharedSingleton;

@end

//---------------------------------------------

#import "Singleton.h"

@implementation Singleton

static id _instance;

//alloc方法内部会调用这个方法
+ (instancetype)allocWithZone:(struct _NSZone *)zone {
    if (_instance == nil) {       // 防止频繁加锁
        @synchronized(self) {  
            if (_instance == nil) { // 防止创建多次
                _instance = [super allocWithZone:zone];
            }
        }
    }
    return _instance;
}

+ (instancetype)sharedSingleton {
    if (_instance == nil) { // 防止频繁加锁
        @synchronized(self) {
            if (_instance == nil) { // 防止创建多次
                _instance = [[self alloc] init];
            }
        }
    }
    return _instance;
}

- (id)copyWithZone:(NSZone *)zone {
    return _instance;
}

- (id)mutableCopyWithZone:(NSZone *)zone {
    return _instance;
}
@end

@synchronized的作用是创建一个互斥锁,保证此时没有其它线程对self对象进行修改,保证代码的安全性。也就是包装这段代码是原子性的,安全的。这个是objective-c的一个锁定令牌,防止self对象在同一时间内被其他线程访问,起到保护线程安全的作用。

饿汉模式:

#import <Foundation/Foundation.h>

@interface Singleton : NSObject<NSMutableCopying, NSCopying>

//获取单例
+ (instancetype)sharedSingleton;

@end

//---------------------------------------------

#import "Singleton.h"

@implementation Singleton

static id _instance;

//当类加载到OC运行时环境中(内存),就会调用一次(一个类只会加载1次)
+ (void)load{
    _instance = [[self alloc] init];
}

+ (instancetype)allocWithZone:(struct _NSZone *)zone{
    if (_instance == nil) { // 防止创建多次
        _instance = [super allocWithZone:zone];
    }
    return _instance;
}

+ (instancetype)sharedSingleton{
    return _instance;
}

- (id)copyWithZone:(NSZone *)zone{
    return _instance;
}

- (id)mutableCopyWithZone:(NSZone *)zone {
    return _instance;
}
@end
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-09-12 13:16:58  更:2021-09-12 13:17:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 16:54:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码